我有一些通过Google表单提供的调查数据。 Google会生成一份回复的电子表格,但我需要做的是将这些数据拆分为单独的回复,以便人类可以将其读取,就好像是在博客上发布的采访一样。
所以,让我说我有这样的事情:
1st Question 2nd Question 3rd Question
"Response1 q1" "Response1 q2" "Response1 q3"
"Response2 q1" "Response2 q2" "Response2 q3"
"Response3 q1" "Response3 q2" "Response3 q3"
第一行(列标题)是问题,每行都有对这些问题的回答。我想要制作的是这样的:
1st Question
-------
Response1 q1
2nd Question
-------
Response1 q2
3rd Question
-------
Response1 q3
基本上,对于每个受访者,我想制作一个单独的文件,以线性方式显示他们的问题回答。
我已经向您提供了我试图解决的问题的具体细节,以防我的特定案例的快捷方式,但一般来说,如果您有数据。在R中的框架,无论出于何种原因,你需要逐行遍历然后逐列遍历,如何才能完成为循环编写一些内容的缺点?
答案 0 :(得分:3)
假设您的数据位于数据框中(包含字符串,而不是因子),如下所示:
qdata = structure(list(Q1.text = c("1r.text", "2r.text", "3r.text"),
Q2.text = c("1r.text", "2r.text", "3r.text"), Q3.text = c("1r.text",
"2r.text", "3r.text"), Q4.text = c("1r.text", "2r.text",
"3r.text")), .Names = c("Q1.text", "Q2.text", "Q3.text",
"Q4.text"), class = "data.frame", row.names = c(NA, -3L))
(下次,与dput
分享您的数据,以使其结构易于重现。)
我会选择矢量化解决方案。在这里,我转换为矩阵,然后将列名粘贴到条目中,由新行("\n"
)和破折号分隔,如示例所示。
qdata.m = as.matrix(qdata)
# Next, we take advantage of "recycling" of the column names,
# pasting them to the matrix values with a newline "\n" separator.
qdata.m = paste(colnames(qdata.m), "-------", t(qdata.m), sep = "\n")
# Note that matrices are normally used column-wise, so I transpose t()
# to make it row-wise instead.
# cat is good for putting text into a file. We'll separate each
# element with two line breaks.
cat(qdata.m, sep = "\n\n")
# Q1.text
# -------
# 1r.text
#
# Q2.text
# -------
# 1r.text
#
# Q3.text
# -------
# 1r.text
# etc.
此处使用cat
的一个优点是它可以直接打印到文件(或者您可以先打开与sink
的连接---有关详细信息,请参阅相关帮助页面)。
在更一般的情况下,如果你需要逐行,然后逐列,你可以使用嵌套的for循环。看起来你当时并没有真正使用数据框结构,所以你可以把它变成一个带unlist()
的向量。事实上,在这种情况下,这可能比我上面做的更容易:< / p>
qvect = unlist(qdata)
# pasting much as above, with an order() to sort by the text
# (the order step may take more care with non-dummy text that isn't
# alphabetical)
qvect = paste(names(qvect), "--------", qvect, sep = "\n")[order(qvect)]
然后您可以按照上述步骤继续cat
。
答案 1 :(得分:1)
这是使用循环执行此操作的标准方法:
for(i in 1:nrow(df)){ #traverse rows
for(ii in 1:ncol(df)){ #traverse cols
#do whatever
}
}
其中df
是您的数据框