2017-04-21 24 views
1

假設我們有兩列,一個字,一個數字一個數據幀:只在特定的指數數據幀的串聯串行

df <- data.frame(chr = letters[1:10], 
      ind = c(NA, NA, 1, NA, NA, 2, NA, NA, 3, NA)) 

    chr ind 
1 a NA 
2 b NA 
3 c 1 
4 d NA 
5 e NA 
6 f 2 
7 g NA 
8 h NA 
9 i 3 
10 j NA 

你會如何粘貼chr列每次服用行只有在ind的非NA指數之間的行?

我想要的第一行,直到忽略所述第一非NA,然後我們遇到ind = 1,則串聯「d」和「e」,則我們遇到ind = 2,則串聯的「g」和「h 「等等創建:

newChar 
"d e" 
"g h" 
"j" 

你會如何做到這一點沒有for循環?

+0

你問的問題和分鐘之內你想出解決辦法,下面寫的所有代碼,並張貼在這裏呢? – BigDataScientist

+0

不,我寫了這個問題,然後認爲我必須能夠解決它,然後認爲我的解決方案可能會使其他人受益,併發布問題和答案。根據SO「法律」,這是錯誤的嗎?告訴我,我會刪除一切。 –

+0

夠公平的。我不知道規則,只是讓我困惑了一下;) – BigDataScientist

回答

1

好的,我明白了。訣竅是使用zoo::na.locf填滿NA值,然後group_bypaste

library(dplyr) 
library(zoo) 
df %>% 
    mutate(bool = is.na(ind), groupID = na.locf(ind, na.rm = FALSE)) %>% 
    filter(bool & !is.na(groupID)) %>% group_by(groupID) %>% 
    summarise(newChr = paste(chr, collapse = " ")) %>% 
    select(newChr)