使用sqldf时克服数据帧强制到列表

时间:2015-06-08 10:14:02

标签: r dataframe sqldf coercion

我需要根据数据框{{1}中两列PresentNot present中的值将行分为两组(Var1Var2) }}。稍后将此列作为新列添加到另一个数据框pum。如果值data.cov.cat$PUVar1大于0.053Var2,则行需要标记为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的列已经分解,我也在这里进行转换。

1 个答案:

答案 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

现在,没有面临强制。