2017-04-10 54 views
0

的數據幀包含ID,組,n(數字),和幾個因子變量接合第一n因子(具有不同的n)中的R

ID <- c(1,2,3,4,5,6,7,8,9,10) 
group <- c("m", "m", "m", "f", "f", "m", "m", "f", "f", "m") 
n <- c(1,2,6,3,6,8,4,1,4,2) 
b1 <- c("a", "b", "", "a", "d", "d", "a", "c", "c", "b") 
b2 <- c("a", "", "e", "a", "d", "d", "a", "c", "c", "b") 
b3 <- c("a", "b", "", "a", "", "d", "a", "c", "c", "b") 
b4 <- c("a", "b", "e", "a", "", "d", "a", "c", "c", "b") 
b5 <- c("a", "b", "e", "a", "d", "", "", "", "c", "b") 
b6 <- c("a", "", "", "", "d", "d", "", "c", "c", "b") 
df <- data.frame(ID, group, n, b1, b2, b3, b4, b5, b6) 

我需要創建一個新的字符列(稱之爲Y)。

他們的方式來計算y是通過加入第一n個變量(B1,B2,B3,B4,B5,B6),並用逗號將它們分開。

注意,如果列是空白,請將其從聯接中刪除。

例如,對於ID = 1,y =「a」;對於ID = 2,y =「b」(而不是「b」);爲ID = 3,Y = 「E,E,E」,等等

而且,更快的代碼,就越好。

+0

你有什麼這麼遠嗎? – alistaire

+0

我可以使用粘貼(b1,b2,...,sep =「,」)將它們全部加入,但不知道如何合併n。 – user9292

+0

不用擔心b1,b2,...,b6的值....他們是我剛剛生成的東西 – user9292

回答

2

一個可能sollution,速度仍可能是一個問題:

df$y <- sapply(seq_len(nrow(df)), function(i){ 
    cvec <- head(unlist(df[i, 4:9]), df$n[i]) 
    cvec <- cvec[!cvec == ''] 
    paste(cvec, collapse = ',') 
}) 
# ID group n b1 b2 b3 b4 b5 b6   y 
# 1 1  m 1 a a a a a a   a 
# 2 2  m 2 b  b b b   b 
# 3 3  m 6  e  e e  e,e,e 
# 4 4  f 3 a a a a a  a,a,a 
# 5 5  f 6 d d  d d d,d,d,d 
# 6 6  m 8 d d d d  d d,d,d,d,d 
# 7 7  m 4 a a a a   a,a,a,a 
# 8 8  f 1 c c c c  c   c 
# 9 9  f 4 c c c c c c c,c,c,c 
# 10 10  m 2 b b b b b b  b,b 
+0

謝謝,我正在測試它。另外,在我自己的數據中,因子變量的數量有點大,當我使用你的代碼時,它並不顯示y的所有值。這可以修復。再次感謝。 – user9292

+0

我不知道你的真實數據是怎樣的。也許你可以把'4:9'改成'4:ncol(df)'來覆蓋所有感興趣的因素列。 – mt1022

+0

這不是我的意思 - 抱歉誤會。我的意思是如何增加列y的寬度,以便我可以看到所有連接的列。現在,它看起來被截斷了。 – user9292

0

下面是使用gsubpaste的選項。我們paste「DF」(do.call(paste0, df[-(1:3)])的「B」柱,然後用substring只保留該建議的「N」列中的字符,請使用gsub每個字符之間創建,

df$y <- gsub("(?<=\\S)(?=\\S)", ",", 
      substring(do.call(paste0, df[-(1:3)]), 1, df$n), perl = TRUE) 

df 
# ID group n b1 b2 b3 b4 b5 b6   y 
#1 1  m 1 a a a a a a   a 
#2 2  m 2 b  b b b   b,b 
#3 3  m 6  e  e e  e,e,e 
#4 4  f 3 a a a a a  a,a,a 
#5 5  f 6 d d  d d d,d,d,d 
#6 6  m 8 d d d d  d d,d,d,d,d 
#7 7  m 4 a a a a   a,a,a,a 
#8 8  f 1 c c c c  c   c 
#9 9  f 4 c c c c c c c,c,c,c 
#10 10  m 2 b b b b b b  b,b 
0
df$y <- apply(df, 1, function(r) { 
    gsub("\\s+", "\\,", trimws(paste(head(r[4:9], r["n"]), sep= " ", collapse = " ")))}) 
df 


# ID group n b1 b2 b3 b4 b5 b6   y 
# 1 1  m 1 a a a a a a   a 
# 2 2  m 2 b  b b b   b 
# 3 3  m 6  e  e e  e,e,e 
# 4 4  f 3 a a a a a  a,a,a 
# 5 5  f 6 d d  d d d,d,d,d 
# 6 6  m 8 d d d d  d d,d,d,d,d 
# 7 7  m 4 a a a a   a,a,a,a 
# 8 8  f 1 c c c c  c   c 
# 9 9  f 4 c c c c c c c,c,c,c 
# 10 10  m 2 b b b b b b  b,b 
+0

我不認爲這會考慮'n'列 – akrun

+0

調整爲使用'n' – epi99

+0

使用head(n)而不是min - 用於@ mt1022 – epi99

相關問題