Parsing 将空格分隔的条目拆分为R中的新列

Parsing 将空格分隔的条目拆分为R中的新列,parsing,r,csv,Parsing,R,Csv,我正在编写一个输出.csv文件的调查。在此csv中,我有一些以空格分隔的条目,它们表示多选问题(例如,有多个回答的问题)。最后,我想将这些以空格分隔的条目解析到它们自己的列中,并为它们创建标题,以便知道它们来自何处 例如,我可以从以下内容开始(请注意,multiselect列后面有一个_M): 我想说的是: 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

我正在编写一个输出.csv文件的调查。在此csv中,我有一些以空格分隔的条目,它们表示多选问题(例如,有多个回答的问题)。最后,我想将这些以空格分隔的条目解析到它们自己的列中,并为它们创建标题,以便知道它们来自何处

例如,我可以从以下内容开始(请注意,multiselect列后面有一个_M):

我想说的是:

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) 循环(或使用apply)这些列中的每个条目,确定响应级别,然后相应地创建列 (3) 循环(或使用应用)并在适当的列中放置指示器,以指示选择的存在


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

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

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

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

3) 除了所有个人/观点和经验外,以下是一些(不太偏颇的)文献:

这本书相对简单,省略了小组调查,但给出了大量的R代码和示例,这应该是一个实际的开始


为了防止重新发明你可能想要检查的轮子,一个相当不错的(更不用说模板:)测量导体工具。除此之外,我输入了3个CMS扩展,并且(应该)也能很好地工作(仅测试pbsurvey)。

多选项应始终作为单独的变量编码。也就是说,如果您有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 = "")
#请注意,我以Q4_M变量为例

dtf_ins我同意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

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

谢谢你的回复。我同意你们大多数人的看法,这种格式有点傻,但这正是我必须处理的(调查已编码,下周将投入使用)。这是我从所有的回答中得出的结论。我相信这不是最优雅或最有效的方法,但我认为它应该起作用

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

colnums是可能的“多重选择”答案吗?你事先认识他们吗?如果是这样,这就容易多了。是的,它们是有限的,是的,可能的选择是预先知道的。@aL3Xa:与其将空格改为逗号(在CSV文件中?),不如只分析空格分隔的值。看看我的答案。否则,我同意。如果答案没有出现,但是可能的呢?例如,如果“D”是一个选项,但没有人选择它怎么办。你不想在数据集中保留这方面的记录吗?似乎没有人选择的选项也很有说服力,值得记录。
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")
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)
}