拆分一连串的逗号分隔的数据,并重新编码输出作为因素

我正在清理一些错误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