R将具有多个值字符串的行中的值隐藏到数据帧中的列

时间:2016-01-21 07:23:33

标签: r dataframe

我有一个这样的数据框{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 中的任何循环。请帮帮我

提前致谢

3 个答案:

答案 0 :(得分:3)

一种选择是将{B}列按$拆分为list,将character班级转换为numericstack 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列中的所有唯一值,然后将tablefactor结合使用,同时为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