如何顺序遍历r data.frame中的每一行,然后遍历每一列?

时间:2015-05-14 22:51:47

标签: r loops dataframe

我有一些通过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中的框架,无论出于何种原因,你需要逐行遍历然后逐列遍历,如何才能完成为循环编写一些内容的缺点?

2 个答案:

答案 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是您的数据框