2016-01-21 134 views
2

我有這樣一個數據幀{B中的每一行是值的字符串加入了與$符號豐:與多個值的字符串列的行[R隱蔽值在數據幀

A B 
a 1$2$3 
b 2$4$5 
c 3$2$5 

現在我想像這樣{我想創建這不能不說的價值是存在該行或沒有(B柱),中柱。}:

A B  1 2 3 4 5 
a 1$2$3 1 1 1 0 0 
b 2$4$5 0 1 0 1 1 
c 3$5 0 0 1 0 1 

我想這樣做沒有R中使用任何循環。請幫我

在此先感謝

+0

來自你方的任何嘗試? –

+0

是的,我與循環做了它已: 爲(I在1:nrow(DF)){ \t LST = strsplit(as.character(DF $ B [1]), '\\ $')[[ 1]] \t爲(j在1:長度(LST)){ \t \t DF [I,LST [J] = 1 \t} } DF [is.na(DF)] = 0 但是想要一個有效的代碼。 –

回答

3

這是另一種嘗試。首先,我得到跨越B列中的所有唯一值,然後用factor結合table而對於B列的所有分裂指定這些級別(從@akrun一些意見後編輯)

temp <- strsplit(as.character(df$B), "\\$") # Save the split column 
lvls <- unique(unlist(temp)) # Get unique values 
df[lvls] <- do.call(rbind, lapply(temp, function(x) table(factor(x, levels = lvls)))) 
df 

# A  B 1 2 3 4 5 
# 1 a 1$2$3 1 1 1 0 0 
# 2 b 2$4$5 0 1 0 1 1 
# 3 c 3$2$5 0 1 1 0 1 
3

一種選擇是由$分裂「B」柱爲list,轉換characternumericstacklistdata.frame,改變「IND」列到numeric,使用sparseMatrix我們將它轉​​換爲二進制矩陣,然後cbind與原始數據集來獲得預期的輸出。

lst <- lapply(strsplit(as.character(df1$B), "[$]"), as.numeric) 
df2 <- stack(setNames(lst, seq_along(lst))) 
df2$ind <- as.numeric(as.character(df2$ind)) 
library(Matrix) 
cbind(df1, as.matrix(sparseMatrix(df2$ind, df2$values, x=1))) 
# A  B 1 2 3 4 5 
#1 a 1$2$3 1 1 1 0 0 
#2 b 2$4$5 0 1 0 1 1 
#3 c 3$2$5 0 1 1 0 1 
+2

一個有趣的方法。我有一天需要看一下Matrix包... –

+1

謝謝@akrun .. –

3

您也可以嘗試cSplit_e從我的 「splitstackshape」 套餐:

library(splitstackshape) 
cSplit_e(mydf, "B", "$", fill = 0) 
# A  B B_1 B_2 B_3 B_4 B_5 
# 1 a 1$2$3 1 1 1 0 0 
# 2 b 2$4$5 0 1 0 1 1 
# 3 c 3$2$5 0 1 1 0 1 

或者mtabulate從 「qdapTools」:

library(qdapTools) 
cbind(mydf, mtabulate(strsplit(mydf$B, "\\$"))) 
# A  B 1 2 3 4 5 
# 1 a 1$2$3 1 1 1 0 0 
# 2 b 2$4$5 0 1 0 1 1 
# 3 c 3$2$5 0 1 1 0 1 
相關問題