我需要根据数据框{{1}中两列Present
,Not present
中的值将行分为两组(Var1
或Var2
) }}。稍后将此列作为新列添加到另一个数据框pum
。如果值data.cov.cat$PU
中Var1
大于0.053
或Var2
,则行需要标记为c(1,2,3)
其他Present
。
下面的代码是根据条件开发的。
Not present
该命令正确执行,输出符合预期,但数据帧data.cov.cat$PU <- sqldf("SELECT CASE WHEN Var1 >= 0.053 THEN 'Present'
WHEN Var1 < 0.053 OR Var2 IN (1,2,3) THEN 'Present'
WHEN Var1 < 0.053 OR Var2 = 0 THEN 'Not present'
ELSE 'NA'
END as newCol
FROM pum")$newCol
被强制转换为列表。
您能否建议如何避免将数据帧的错误列入清单。
可重复的例子:
data.cov.cat
由于原始data.frame的列已经分解,我也在这里进行转换。
答案 0 :(得分:2)
data.cov.cat
不是最后一个sqldf
语句执行之前的数据帧。当sapply
执行时,它已被更改为矩阵。可重现的例子的解决方案是:
data.cov.cat <- data.frame(V1 = runif(10,0,10), V12 = c("blue", "red", "yellow", "pink","blue", "red", "yellow", "pink", "red", "yellow"))
data.cov.cat <- as.data.frame(sapply(data.cov.cat, as.factor))
pum <- data.frame(Var1 = runif(10,0,1), Var2 = c(1,3,2,0,2,1,2,0,1,3))
data.cov.cat$PU <- sqldf("SELECT CASE WHEN Var1 >= 0.053 THEN 'Present'
WHEN Var1 < 0.053 OR Var2 IN (1,2,3) THEN 'Present'
WHEN Var1 < 0.053 OR Var2 = 0 THEN 'Not present'
ELSE 'NA'
END as newCol
FROM pum")$newCol
现在,没有面临强制。