使用 sqldf 时克服将数据帧强制转换为列表的问题
Overcome the coercion of dataframe to a list when using sqldf
我需要根据数据框 Var1
、Var2
两列中的值将行分为两组(Present
或 Not present
)pum
。稍后将其作为新列添加到另一个数据框中,如 data.cov.cat$PU
。当值 c(1,2,3)
中的 Var1
大于 0.053
或 Var2
时,行需要标记为 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
现在,胁迫不面对了
我需要根据数据框 Var1
、Var2
两列中的值将行分为两组(Present
或 Not present
)pum
。稍后将其作为新列添加到另一个数据框中,如 data.cov.cat$PU
。当值 c(1,2,3)
中的 Var1
大于 0.053
或 Var2
时,行需要标记为 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
现在,胁迫不面对了