2017-04-10 7 views
0

に(異なるnの)最初のn個の要素を結合し、いくつかの要因変数データフレームID、グループ、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'の 'b'列(do.call(paste0, df[-(1:3)])を入力し、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

minの代わりにhead(n)を使用してください - @ mt1022 – epi99

関連する問題