【问题标题】:splitting space delimited entries into new columns in R将空格分隔的条目拆分为R中的新列
【发布时间】:2011-03-18 21:20:34
【问题描述】:

我正在编写一个输出 .csv 文件的调查。在这个 csv 中,我有一些以空格分隔的条目,它们代表多选问题(例如,具有多个响应的问题)。最后,我想将这些以空格分隔的条目解析到它们自己的列中,并为它们创建标题,这样我就知道它们来自哪里。

例如,我可以从这个开始(注意多选列后面有一个 _M):

Q1, Q2_M, Q3, Q4_M
6, 1 2 88, 3, 3 5 99
6, , 3, 1 2

我想去这个:

Q1, Q2_M_1, Q2_M_2, Q2_M_88, Q3, Q4_M_1, Q4_M_2, Q4_M_3, Q4_M_5, Q4_M_99
6, 1, 1, 1, 3, 0, 0, 1, 1, 1
6,,,,3,1,1,0,0,0

我想这是一个相对常见的问题,但我无法在 R 部分找到它。导入 .csv 后如何在 R 中执行此操作有什么想法吗?我的一般想法(通常会导致程序效率低下)是我可以: (1) 用 grep() 拉取具有特殊后缀的列号 (2) 遍历(或使用应用)这些列中的每个条目并确定响应级别,然后相应地创建列 (3) 循环(或使用应用)并在适当的列中放置指示符以指示存在选择

感谢您的帮助,如果不清楚,请告诉我。

【问题讨论】:

  • 可能的“多重选择”答案是否有限?你事先认识他们吗?如果是这样,这将变得容易得多。
  • 是的,它们是有限的,是的,可能的选择是预先知道的。

标签: parsing r csv


【解决方案1】:

我同意 ran2 和 aL3Xa 的观点,即您可能希望更改数据格式,以便为每个可能的响应设置不同的列。但是,如果您将数据集调整为更好的格式证明存在问题,则可以按照您的要求进行操作。

process_multichoice <- function(x) lapply(strsplit(x, " "), as.numeric)

q2 <- c("1 2 3 NA 4", "2 5")
processed_q2 <- process_multichoice(q2)
[[1]]
[1]  1  2  3 NA  4

[[2]]
[1] 2 5

之所以建议使用不同的列来表示不同的响应,是因为尝试从该表单中的数据中检索任何统计信息仍然非常不愉快。虽然你可以做类似的事情

# Number of reponses given
sapply(processed_q2, length)

#Frequency of each response
table(unlist(processed_q2), useNA = "ifany")

编辑:还有一条建议。将处理数据的代码与分析数据的代码分开。如果您创建任何图表,请将用于创建它们的代码再次分开。我一直在把东西混合在一起,这并不漂亮。 (特别是当你六个月后回到代码时。)

【讨论】:

    【解决方案2】:

    我不完全确定您分别尝试做什么,您这样编码的原因是什么。因此,我的建议更笼统——所以只要澄清一下,我会尽量给出更具体的回应。

    1) 我说您是自己编写调查代码,这很好,因为这意味着您可以影响您的 .csv 文件。我永远不会在同一个 .csv 文件中使用不同类型的分隔。就像您在第二个块中建议的那样,从一开始就进行命名。 否则,例如,您可能会遇到复选框问题。假设有人检查了 5 个可能答案中的 3 个,下一个只检查 1 个(即“不知道”)。现在创建一个电子表格(data.frame)类型的结果视图将比创建一个只需要重新编码的空字段(结果是 R 中的 NA)要困难得多。

    2) 另一个重要问题是您是否打算进行小组调查(即纵向研究一遍又一遍地询问相同的参与者)。这(在许多其他方面)将是考虑将数据保存到 MySQL 数据库而不是 .csv 的一个很好的理由。 RMySQL 可以直接连接到数据库并访问它的表,更重要的是它的 VIEWS。 视图确实有助于调查数据,因为您可以根据许多不同的需求重新排列不同视图中的数据。

    3)除了所有的个人/观点和经验,这里有一些(较少偏见的)文献可以开始: Complex Surveys: A Guide to Analysis Using R (Wiley Series in Survey Methodology

    这本书相对简单,省略了小组调查,但提供了很多 R 代码和示例,应该是一个实用的开始。

    为了防止重新发明轮子,您可能需要检查LimeSurvey,这是一个相当不错的(不是说模板:))用于调查指挥的工具。此外,我的 TYPO3 CMS 扩展 pbsurveyke_questionnaire(应该)也能正常工作(仅测试过 pbsurvey)。

    【讨论】:

      【解决方案3】:

      多项选择项应始终编码为单独的变量。也就是说,如果你有 5 个选项和多项选择,你应该将它们编码为 i1, i2, i3, i4, i5,即每个都是一个二进制变量 (0-1)。我看到您在第一个示例中为 Q4_M 变量提供了值 3 5 99。这是否意味着您在一个项目中有 99 个备选方案?哎哟……

      首先,您应该继续为多项选择项中的每个备选方案创建单独的变量。也就是说,做:

      # note that I follow your example with Q4_M variable
      dtf_ins <- as.data.frame(matrix(0, nrow = nrow(<initial dataframe>), ncol = 99))
      # name vars appropriately
      names(dtf_ins) <- paste("Q4_M_", 1:99, sep = "")
      

      现在你有了一个带有 0 的 data.frame,所以你需要做的是让 1 在适当的位置(这有点麻烦),一个函数就可以完成这项工作......

      # first you gotta change spaces to commas and convert character variable to a numeric one
      y <- paste("c(", gsub(" ", ", ", x), ")", sep = "")
      z <- eval(parse(text = y))
      # now you assing 1 according to indexes in z variable
      dtf_ins[1, z] <- 1
      

      差不多就是这样...基本上,您想重新考虑创建一个带有 _M 变量的 data.frame,因此您可以编写一个自动执行此插入的函数。避免 for 循环!

      或者,更好的是,创建一个具有逻辑的矩阵,然后执行dtf[m] &lt;- 1,其中 dtf 是您的多项选择 data.frame,m 是矩阵有逻辑。

      我想在这方面为您提供更多帮助,但我在度过了一个漫长的夜晚后正在康复! =) 希望我有所帮助! =)

      【讨论】:

      • @aL3Xa:与其将空格更改为逗号(在 CSV 文件中?),不如只解析空格分隔的值。看我的回答。否则,我同意。
      【解决方案4】:

      感谢所有回复。我同意你们大多数人的观点,这种格式有点傻,但这是我必须使用的(调查已编码并在下周开始使用)。这是我从所有回复中得出的结论。我确信这不是最优雅或最有效的方法,但我认为它应该可以工作。

      colnums <- grep("_M",colnames(dat))
      responses <- nrow(dat)
      
      for (i in colnums) {
        vec <- as.vector(dat[,i]) #turn into vector
        b <- lapply(strsplit(vec," "),as.numeric) #split up and turn into numeric
        c <- sort(unique(unlist(b))) #which values were used
        newcolnames <- paste(colnames(dat[i]),"_",c,sep="") #column names
        e <- matrix(nrow=responses,ncol=length(c)) #create new matrix for indicators
        colnames(e) <- newcolnames 
      #next loop looks for responses and puts indicators in the correct places
        for (i in 1:responses) {
        e[i,] <- ifelse(c %in% b[[i]],1,0)
        }
        dat <- cbind(dat,e)
      }
      

      欢迎提出改进建议。

      【讨论】:

      • 如果答案没有出现,但有可能怎么办?例如,如果“D”是一种选择,但没有人选择它怎么办。您不想在数据集中保留记录吗?似乎无人选择的选项也很有说服力,值得记录。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      相关资源
      最近更新 更多