问题描述
我有两个变量,它们包含丢失的数据loon
和profstat
。为了更好地了解缺失的数据和需要进行插补的数据,我想在数据框中创建一个附加变量problem
,如果1
的每种情况下返回该变量loon
丢失并且观察到profstat
,否则观察到0
。我生成了以下代码,仅将其作为输出x[] = 1
。这个问题有解决办法吗?
{
problem <- dim(length(t))
for (i in 1:nrow(dflapopofficial))
{
if (is.na(dflapopofficial$loon[i])==TRUE & is.na(dflapopofficial$profstat[i])==FALSE) {
dflapopofficial$problem[i]=1
} else {
dflapopofficial$problem[i]=0
}
return(problem)
}
解决方法
有些地方可以改进:
- 请记住,R中的许多运算都是矢量化的。进行逻辑检查等时,您不需要遍历向量中的每个元素。
-
is.na(some_condition) == TRUE
与is.na(some_condition)
相同,而is.na(some_condition) == FALSE
与!is.na(some_condition)
相同 - 如果您想在数据框中写入新列,并且要引用该数据框中的多个变量,则使用
within
可以节省很多输入时间-特别是在您的数据框名称很长的情况下 - 您将返回
problem
,但是在循环中,您正在写入dflapipofficial$problem
,这是另一个变量。 - 如果要写1和0,则可以使用
+(logical_vector)
来将逻辑隐式转换为数字
将所有这些放在一起,您可以用单行替换整个循环:
within(dflapopofficial,problem <- +(is.na(loon) & !is.na(profstat)))
记住要保存结果,既可以存储回数据框,也可以存储到其副本,例如
df <- within(dflapopofficial,problem <- +(is.na(loon) & !is.na(profstat)))
因此,df
只是dflapopofficial
的一副,加上额外的列。