【问题标题】:R: not meaningful as factorsR:作为因素没有意义
【发布时间】:2015-02-16 11:32:09
【问题描述】:

当这个特定问题出现时,处理这个特定问题的最佳做法是什么?例如我创建了一个数据框:

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 是正确的方法

【问题讨论】:

  • 不清楚你想总结什么。是RESULT=='Y'sum 吗?如果是这种情况with(dat, tapply(as.character(RESULT)=='Y', GROUP, FUN=sum)) 或使用table。 IE。 table(dat[-1])
  • @akrun - 谢谢,是的,这正是我想做的。我的 tapply 声明也不太正确,所以谢谢你的澄清。 as.character 负责处理这些因素。谢谢

标签: r


【解决方案1】:

我假设您想总结 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() 或将结果转换为布尔值。

【讨论】:

  • 感谢@MTk。是的,我以前用过 table 命令,谢谢提醒。可能更容易全面。 akrun 提供了一个令人满意的方法,即使用 tapply() 也可以做到这一点。有趣的是能够抑制 sqlQuery() 中的因素。好提示,我会经常使用那个!!
【解决方案2】:

我也不清楚你的问题是什么。如果你只是想总结 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))

【讨论】:

  • 请注意,通常最好先让 OP 用评论清除问题,然后再尝试回答。谢谢
猜你喜欢
  • 2013-08-05
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多