用dplyr进行简单突变,得到;错误的结果大小“;错误

用dplyr进行简单突变,得到;错误的结果大小“;错误,r,dplyr,R,Dplyr,我的数据表df有一个subject列(例如“SubjectA”、“SubjectB”、…)。每个主题都回答了许多问题,表格格式很长,因此每个主题都有许多行。主题栏是一个因素。我想创建一个新列,称之为subject.id,它只是subject的数字版本。因此,对于所有带有“SubjectA”的行,它将是1;对于所有带有“SubjectB”的行,它将是2;等等 我知道使用dplyr实现这一点的简单方法是调用df%>%mutate(subject.id=as.numeric(subject))。但我试

我的数据表
df
有一个
subject
列(例如“SubjectA”、“SubjectB”、…)。每个主题都回答了许多问题,表格格式很长,因此每个主题都有许多行。主题栏是一个因素。我想创建一个新列,称之为
subject.id
,它只是
subject
的数字版本。因此,对于所有带有“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))
为什么会发生这种情况?我对解决这个特殊问题的其他方法不感兴趣。相反,我担心我无法理解这个错误反映了对
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$subject.id%变异(subject.id=which(as.character(subject)==subc.list))

由于您的
df$subject
是一个因素,您可以简单地执行以下操作:

df %>% mutate(subj.id=as.numeric(subject))
或者使用左连接方法:

subj.df <- df$subject %>% 
    unique() %>% 
    as_tibble() %>% 
    rownames_to_column(var = 'subj.id')

df %>% left_join(subj.df,by = c("subject"="value"))
sub.df%
唯一()%>%
as_tible()%>%
行名称到列(变量='subc.id')
df%>%左联合(subc.df,by=c(“subject”=“value”))

问题在于,运算符和函数通过mutate以向量化的方式应用。因此,
将其应用于由
作为.character(df$subject)==sub.list生成的向量,而不是应用于每一行(如循环中)

如本文所述,按行使用

因此,这将起作用:

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

谢谢你的回复。我知道还有其他方法可以解决这个问题,但我的问题是为什么我提出的方法不起作用。我担心我对
mutate
dplyr
@AdamMorris有一些深刻的误解,啊,嗯。我不能马上回答这个问题!希望有人能帮忙!
subj.df <- df$subject %>% 
    unique() %>% 
    as_tibble() %>% 
    rownames_to_column(var = 'subj.id')

df %>% left_join(subj.df,by = c("subject"="value"))
df %>% 
  rowwise() %>%
  mutate(subject.id = which(as.character(subject) == subj.list))