2017-03-01 31 views
3

我的數據表df有一個subject列(例如「SubjectA」,「SubjectB」,...)。每個主題回答很多問題,並且表格是長格式的,所以每個主題有很多行。主題欄是一個因素。我想創建一個新列 - 將其稱爲subject.id - 這只是subject的數字版本。因此對於所有具有「SubjectA」的行,它將是1;對於所有具有「SubjectB」的行,它將是2;等等使用dplyr進行簡單突變會導致「錯誤的結果大小」錯誤

我知道一個簡單的方法來做到這一點與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 

爲什麼會出現這種情況?我對解決這個問題的其他方法並不感興趣。相反,我擔心我無法理解這個錯誤反映了對dplyrmutate的深刻誤解。我的理解是,這個電話應該在概念上相當於:

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

回答

1

的問題在於運營商和功能是適用的通過變異以矢量化方式編輯。因此,which應用於由as.character(df$subject) == subj.list生成的向量,而不是每行(如在您的循環中)。

使用這裏描述rowwise作爲將解決這一問題:https://stackoverflow.com/a/24728107/3772587

所以,這將工作:

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

由於您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")) 
+0

感謝您的答覆。我知道還有其他方法可以解決特定的問題,但我的問題是爲什麼我提出的方法不起作用。我擔心我對「mutate」或「dplyr」有一些深刻的誤解。 –

+0

@AdamMorris啊,嗯。我無法正確回答!希望有人能幫忙! – Rahul