2017-04-10 42 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

相关问题