为了整理数据集的一部分,我需要将一列分成几列。这些数据采用与此类似的形式:
df$One <- ifelse(grepl("1", df$a) == T, 1, 0)
df$Two <- ifelse(grepl("2", df$a) == T, 1, 0)
a One Two
1 6 0 0
2 2%3%4 0 1
3 6%2 0 1
4 3%2 0 1
5 5%2%4 0 1
Tidyr的独立功能不会完成这项工作,我所拥有的最好的想法是一系列ifelse陈述,如下所示:
{{1}}
这种整理的最佳方式是什么?我相信很多人使用Open Data Kit(ODK)进行数据收集都会遇到这种情况。
答案 0 :(得分:2)
我们可以使用sapply
循环模式(即1,2),获取逻辑矩阵,通过包裹+
强制转换为二进制并将其指定为'df'中的新列
df[c("One", "Two")] <- +(sapply(1:2, grepl, df$a))
df
# a One Two
#1 6 0 0
#2 2%3%4 0 1
#3 6%2 0 1
#4 3%2 0 1
#5 5%2%4 0 1
如果要获取'a'列中每个唯一值的二进制输出,我们可以用分隔符(%
)将字符串拆分为'a',输出list
可以是通过指定data.frame
并stack
factor
“值”列转换为levels
,将table
转换为table(transform(stack(setNames(strsplit(as.character(df$a), "[%]"),
1:nrow(df))), values = factor(values, levels= 1:6))[2:1])
>
mtabulate
或者我们可以在分割后使用来自qdapTools
的便捷函数library(qdapTools)
mtabulate(strsplit(as.character(df$a), "[%]"))
。
{{1}}