我有一个这样的数据框{B中的每一行都是一个字符串,其值与$符号连接}:
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 :(得分:3)
一种选择是将{B}列按$
拆分为list
,将character
班级转换为numeric
,stack
list
1}}到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
答案 1 :(得分:3)
这是另一次尝试。首先,我获取B
列中的所有唯一值,然后将table
与factor
结合使用,同时为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
答案 2 :(得分:3)
您也可以尝试{&#34; splitstackshape&#34;}中的cSplit_e
包:
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
或者,来自&#34; qdapTools的mtabulate
&#34;:
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