使用dplyr进行简单变异会产生“错误的结果大小”错误

我的数据表df具有主题列(例如“SubjectA”,“SubjectB”,……).每个主题都回答了很多问题,表格是长格式的,因此每个主题都有很多行.主题栏是一个因素.我想创建一个新列 – 称之为subject.id – 这只是主题的数字版本.因此,对于具有“SubjectA”的所有行,它将为1;对于具有“SubjectB”的所有行,它将是2;等等

我知道使用dplyr执行此操作的简单方法是调用df%>%mutate(subject.id = as.numeric(subject)).但我试图这样做:

subj.list <- unique(as.character(df$subject))
df %>% mutate(subject.id = which(as.character(subject) == subj.list))

我收到这个错误:

Error: wrong result size (12), expected 72 or 1

为什么会这样?我对解决这个特殊问题的其他方法不感兴趣.相反,我担心我无法理解这个错误反映了对dplyr或mutate的深刻误解.我的理解是这个调用应该在概念上等同于:

df$subject.id <- NULL
for (i in 1:nrow(df)) {
   df$subject.id[i] <- which(as.character(df$subject[i]) == subj.list))
}

但后者起作用而前者不起作用.为什么?

可重复的例子:

df <- InsectSprays %>% rename(subject = spray)
subj.list <- unique(as.character(df$subject))

# this works
df$subject.id <- NULL
for (i in 1:nrow(df)) {
   df$subject.id[i] <- which(as.character(df$subject[i]) == subj.list)
}

# but this doesn't
df %>% mutate(subject.id = which(as.character(subject) == subj.list))

最佳答案 问题是运算符和函数是通过mutate以矢量化方式应用的.因此,它应用于由as.character(df $subject)== subj.list生成的向量,而不是每行(如在循环中).

如此处所述使用rowwise将解决问题:https://stackoverflow.com/a/24728107/3772587

所以,这将工作:

df %>% 
  rowwise() %>%
  mutate(subject.id = which(as.character(subject) == subj.list))
点赞