11

我正在尝试清理一些输入错误的数据。变量的问题允许从五个选项中选择多个响应,编号为 1 到 5。数据已按以下方式输入(这只是一个示例——实际数据中有更多变量和更多观察值框架):

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

下面是一些重新创建示例数据的代码:

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"))

我真正需要的是要更多处理的数据......二进制 - 就像一组“是/否”问题 - 输入一个看起来更像的数据框中:

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

实际的变量名目前并不重要——我可以很容易地解决这个问题。此外,缺少的元素是“O”、“NA”还是空白并不重要——这也是我以后可以修复的问题。

我已经尝试使用包中的transform函数reshape以及使用不同的东西strsplit,但我无法做我正在寻找的东西。我还查看了有关 Stackoverflow 的许多其他相关问题,但它们似乎并不是完全相同的问题。

4

3 回答 3

8

您只需要编写一个函数并使用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)

接下来,创建一个接收一行并根据需要进行转换的函数

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))
于 2012-04-11T06:33:12.627 回答
8

很长一段时间后,我终于开始创建一个包(“splitstackshape”),以有效的方式处理这种数据。因此,为了方便其他人(当然还有一些自我推销),这里有一个紧凑的解决方案。

这个问题的相关函数是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
于 2013-09-03T16:14:52.110 回答
1

这是我第一次回答关于stackoverflow的问题。请让我知道这是否有意义。

我在处理一些 qualtrics 数据时遇到了这个问题。我用 grepl 来解决这个问题。我已经包含了一个指向 r 文档的链接。
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/grep

据我了解,Grepl 在一组数据中查找模式,如果模式存在或不存在,将分别指示 TRUE 或 FALSE。我创建了一个新变量。如果模式存在,那么我将新变量编码为 1。如果模式不存在,那么我将其编码为 0。这是一个问题的样子。

data$V1.1<- NULL
data$V1.1<- 0
data$V1.1[grepl (1, data$V1)] <- 1
table (data$V1.1, exclude = FALSE)

然后可以为剩余的问题重复此代码。如果只有几个响应选项,那么此代码应该可以正常工作。但是如果有很多响应选项,那么您可能需要设置一个循环。

于 2021-12-07T18:21:55.847 回答