使用 sqldf 时克服将数据帧强制转换为列表的问题

Overcome the coercion of dataframe to a list when using sqldf

我需要根据数据框 Var1Var2 两列中的值将行分为两组(PresentNot presentpum。稍后将其作为新列添加到另一个数据框中,如 data.cov.cat$PU。当值 c(1,2,3) 中的 Var1 大于 0.053Var2 时,行需要标记为 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.cov.cat <- data.frame(V1 = runif(10,0,10), V12 = c("blue", "red", "yellow", "pink","blue", "red", "yellow", "pink", "red", "yellow"))

data.cov.cat <- 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

因为原来的 data.frame 对列进行了分解,所以我在这里也将它们转换。

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

现在,胁迫不面对了