2017-03-07 79 views
1

我有這5列的數據幀有條件置字符串

val1 val2 val3 val4 val5 
1 0 3 0 5 
0 0 0 0 5 
1 2 0 0 0 

我試圖創建一個新的列有一個條件:連接(計算結果不能串連零)

val6 
1,3,5 
5 
1,2 

有什麼想法嗎?

+1

也可能像'GSUB( 「NA | NA」 ,「」,do.call(paste,c(sep =「,」,replace(df,df == 0,NA))))' –

回答

0

我認爲這是重複的。但是,找不到一個如此回答。

我們可以使用apply逐行,並刪除值爲0的元素,並粘貼剩餘值,用逗號分隔。

df$val6 <- apply(df, 1, function(x) paste0(x[x!=0], collapse = ",")) 
df 

# val1 val2 val3 val4 val5 val6 
#1 1 0 3 0 5 1,3,5 
#2 0 0 0 0 5  5 
#3 1 2 0 0 0 1,2 

另一種選擇,可以使用by

df$val6 <- by(df, 1:nrow(df), function(x) paste0(x[x!=0], collapse = ",")) 
+0

'apply' o不幸的是,數據幀非常低效,因爲數據被轉換爲矩陣,需要複製整個數據(不同的存儲器佈局意味着它不能共享表示)。 –

0

我們可以replace嘗試gsub

gsub("NA\\s*|\\s*NA|NA+", "", do.call(paste,replace(df1, df1==0, NA))) 
#[1] "1 3 5" "5"  "1 2"