出现这个特定问题时,最佳做法是什么?例如,我创建了一个数据框:
dat<- sqlQuery(con,"select * from mytable")
我的表格如下:
ID RESULT GROUP
-- ------ -----
1 Y A
2 N A
3 N B
4 Y B
5 N A
其中ID是int,Result和Group都是因素。
问题是,当我想做类似的事情时:
tapply(dat$RESULT,dat$GROUP,sum)
我抱怨列是一个因素:
Error in Summary.factor(c(2L,2L,2L,2L,1L,2L,1L,2L,2L,1L,1L, :
sum not meaningful for factors
鉴于ggplot等因素必不可少,其他人如何处理?
设置stringsAsFactors = FALSE并重新运行给出
tapply(dat$RESULT,dat$GROUP,sum)
Error in FUN(X[[1L]], ...) : invalid "type" (character) or argument
所以我不确定只设置stringsAsFactors = FALSE是正确的方法
答案 0 :(得分:2)
我假设您想在RESULT列中总结“Y”。
正如@akrun所建议的,一种可能性是使用table()
with(dat,table(GROUP,RESULT))
如果您想坚持使用tapply()
,可以将RESULT列的类型更改为布尔值:
dat$RESULT <- dat$RESULT=="Y"
tapply(dat$RESULT,dat$GROUP,sum)
如果您的目标是将某些列作为因子而将其他列作为字符串,则可以将结果转换为仅选定列的因子,例如:与
dat<- sqlQuery(con,"select ID,RESULT,GROUP from mytable",as.is=2)
与read.table
man page一样(由sqlQuery手册页回忆):as.is
是逻辑向量(必要时可以回收值)或向量数字或字符索引,指定哪些列不应转换为因子。
但话说回来,您需要使用table()
或将结果转换为布尔值。
答案 1 :(得分:0)
我也不清楚你的问题是什么。如果您只想尝试总结Y,那么:
library(dplyr)
df <- data.frame(ID = 1:5,
RESULT = as.factor(c("Y","N","N","Y","N")),
GROUP = as.factor(c("A", "A", "B", "B", "A")))
df %>% mutate(logRes = (RESULT == "Y")) %>%
summarise(sum=sum(logRes))