拆分一连串的逗号分隔的数据,并重新编码输出作为因素
我正在清理一些错误input的数据。 variables的问题允许五个选项中的多个响应,编号为1到5.数据以下列方式input(这只是一个例子 – 实际数据中有更多的variables和更多的观察值帧):
data V1 1 1, 2, 3 2 1, 2, 4 3 2, 3, 4, 5 4 1, 3, 4 5 1, 3, 5 6 2, 3, 4, 5
以下是重新创build示例数据的一些代码:
data = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", "1, 3, 4", "1, 3, 5", "2, 3, 4, 5"))
我真正需要的是要处理的数据更多…二进制 – 就像是一组“是/否”问题 – input到数据框中,看起来更像是:
data V1.1 V1.2 V1.3 V1.4 V1.5 1 1 1 1 NA NA 2 1 1 NA 1 NA 3 NA 1 1 1 1 4 1 NA 1 1 NA 5 1 NA 1 NA 1 6 NA 1 1 1 1
实际的variables名称目前并不重要 – 我可以很容易地解决这个问题。 此外,缺失的元素是“O”,“NA”还是空白也没有关系,这是我以后可以修复的。
我已经尝试使用reshape
包装的transform
函数以及用strsplit
提供不同的东西,但我不能得到任何我想要的。 我也看了很多关于Stackoverflow的其他相关的问题,但是他们似乎并不是完全相同的问题。
你只需要写一个函数并使用apply
。 首先是一些虚拟数据:
##Make sure you're not using factors dd = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", "1, 3, 4", "1, 3, 5", "2, 3, 4, 5"), stringsAsFactors=FALSE)
接下来,创build一个函数,并根据需要进行转换
make_row = function(i, ncol=5) { ##Could make the default NA if needed m = numeric(ncol) v = as.numeric(strsplit(i, ",")[[1]]) m[v] = 1 return(m) }
然后使用apply
并转置结果
t(apply(dd, 1, make_row))
很长一段时间后,我终于开始创build一个能够高效处理这种数据的包( “splitstackshape” )。 所以,为了他人的方便(当然还有一些自我推销),这里是一个紧凑的解决scheme。
这个问题的相关函数是cSplit_e
。
首先是保留原始列并使用NA
作为填充的默认设置:
library(splitstackshape) cSplit_e(data, "V1") # V1 V1_1 V1_2 V1_3 V1_4 V1_5 # 1 1, 2, 3 1 1 1 NA NA # 2 1, 2, 4 1 1 NA 1 NA # 3 2, 3, 4, 5 NA 1 1 1 1 # 4 1, 3, 4 1 NA 1 1 NA # 5 1, 3, 5 1 NA 1 NA 1 # 6 2, 3, 4, 5 NA 1 1 1 1
其次,删除原始列并使用0
作为填充。
cSplit_e(data, "V1", drop = TRUE, fill = 0) # V1_1 V1_2 V1_3 V1_4 V1_5 # 1 1 1 1 0 0 # 2 1 1 0 1 0 # 3 0 1 1 1 1 # 4 1 0 1 1 0 # 5 1 0 1 0 1 # 6 0 1 1 1 1