我有這樣一個數據幀{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中使用任何循環。請幫我
在此先感謝
我有這樣一個數據幀{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中使用任何循環。請幫我
在此先感謝
這是另一種嘗試。首先,我得到跨越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
一種選擇是由$
分裂「B」柱爲list
,轉換character
類numeric
,stack
的list
到data.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
一個有趣的方法。我有一天需要看一下Matrix包... –
謝謝@akrun .. –
您也可以嘗試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
來自你方的任何嘗試? –
是的,我與循環做了它已: 爲(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 但是想要一個有效的代碼。 –