用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))