在R-ODK清理中分离不整洁的数据

在R-ODK清理中分离不整洁的数据,r,tidy,odk,R,Tidy,Odk,要整理数据集的一部分,我需要将一列分隔为若干列。这些数据的形式与此类似: 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

要整理数据集的一部分,我需要将一列分隔为若干列。这些数据的形式与此类似:

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
set.seed(2133)
df我们可以使用
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
或者,我们可以在拆分后使用
qdapTools
中的方便函数
mtabulate

library(qdapTools)
mtabulate(strsplit(as.character(df$a), "[%]"))

我喜欢基本版本。不错的选择。出于兴趣-不整洁的数据是否直接来自表单?首先,您从ODK(聚合的哪一部分?)获取数据到R的过程是什么?我这样问是因为你的问题可能在于这一途径,而不是数据。@Florian,是的,通过使用聚合。不幸的是,我们无法做出如此深远的改变。
table(transform(stack(setNames(strsplit(as.character(df$a), "[%]"),
       1:nrow(df))), values = factor(values, levels= 1:6))[2:1])
library(qdapTools)
mtabulate(strsplit(as.character(df$a), "[%]"))