2015-10-27 45 views
1

循環我有一些數據從Wikipedia與tidyr

RHCP_data 
       V1    V2    V3   V4 
1  bar:kiedis from:01/01/1983 till:01/11/1986 color:vocals 
2  bar:kiedis from:01/12/1986  till:end color:vocals 
3   bar:flea from:01/01/1983  till:end color:bass 
4  bar:smith from:03/12/1988  till:end color:drums 
5 bar:klinghoffer from:01/10/2009  till:end color:lead 
6  bar:slovak from:01/01/1983 till:01/12/1983 color:lead 
7  bar:slovak from:01/02/1985 till:25/06/1988 color:lead 
... 
... 

我試圖用tidyr刪除變量名和這個偉大的工程:

separate(RHCP_data, "V1", into = c("a", "b"), sep = ":")[2] 

      b 
1  kiedis 
2  kiedis 
3   flea 
4  smith 
5 klinghoffer 
6  slovak 
7  slovak 
... 
... 

我想明白爲什麼這樣做不行。

for(i in 1:4){ 
    RHCP_data[,i] <- separate(RHCP_data, paste0("V", i), into = c("a", "b"), sep = ":")[2][,1] 
} 

,我得到這個錯誤:

Error: Invalid column specification 

顯然,該數據集是小,所以它不是在這種情況下一個問題,但我覺得有一些關於tidyr或循環我不明白。任何幫助讚賞。

回答

3

要通過可變列,您需要使用separate_而不是separate

如果你想使用一個for循環,我會建議:

lst = lapply(seq(ncol(df)), function(x) { 
    separate_(df, paste0('V', x), into = paste0(c("a", "b"), x), sep = ":")[x:(x+1)][,2] 
}) 

data.frame(setNames(lst, names(df))) 
#   V1   V2   V3  V4 
#1  kiedis 01/01/1983 01/11/1986 vocals 
#2  kiedis 01/12/1986  end vocals 
#3  flea 01/01/1983  end bass 
#4  smith 03/12/1988  end drums 
#5 klinghoffer 01/10/2009  end lead 
#6  slovak 01/01/1983 01/12/1983 lead 
#7  slovak 01/02/1985 25/06/1988 lead 
+0

非常感謝。你知道爲什麼有兩個功能? –

+0

對於這類問題的任何其他人,這是我在最後使用的那行'RHCP_data [,i] < - separate_(RHCP_data,paste0(「V」,i),into = c(「a」,「 b「),sep =」:「)[i + 1]' } –

+1

這個目的有兩個功能:將列名作爲變量傳遞!順便說一句,您使用的for循環會在每次迭代時修改data.frame。當心這將會進入與指數衝突!最好考慮你的功能不是直接在你的原始數據幀上運行,而是創建另一個 - 就像我的建議一樣。 –

3

我們可以簡單地使用cSplit而沒有任何循環。

library(splitstackshape) 
DT <- cSplit(RHCP_data, 1:ncol(RHCP_data), ':') 
DT[, seq(2, ncol(DT), by=2), with=FALSE] 
#   V1_2  V2_2  V3_2 V4_2 
# 1:  kiedis 01/01/1983 01/11/1986 vocals 
#2:  kiedis 01/12/1986  end vocals 
#3:  flea 01/01/1983  end bass 
#4:  smith 03/12/1988  end drums 
#5: klinghoffer 01/10/2009  end lead 
#6:  slovak 01/01/1983 01/12/1983 lead 
#7:  slovak 01/02/1985 25/06/1988 lead 
+0

爲什麼這是downvoted?我明白這個問題是關於tidyr的,但它可以通過'cSplit'輕鬆解決。如果我們要降低這樣的問題的話,可以減少data.table問題的dplyr答案嗎? – akrun