1

为了整理数据集的一部分,我需要将一列分成几列。这些数据采用类似于以下的形式:

set.seed(2133)
df <- data.frame(a = paste(sample(1:9, 5, replace=T), sample(c("", "%2", "%3"), 5, replace=T),  sample(c("", "%3", "%4"), 5, replace=T), sep="")) 
df
      a
1     6
2 2%3%4
3   6%2
4   3%2
5 5%2%4

Tidyr 的单独函数无法完成这项工作,我最好的想法是一系列 ifelse 语句,如下所示:

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

进行这种整理的最佳方法是什么。我敢肯定,许多使用 Open Data Kit (ODK) 进行数据收集的人都会遇到这种情况。

4

1 回答 1

2

我们可以用 循环模式(即1、2)sapply,得到一个逻辑矩阵,通过包装强制转换为二进制+并将其分配为'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.frameusing stacktransform'values' 列factor通过指定并且levelstable

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), "[%]"))
于 2016-04-08T11:55:28.417 回答