【问题标题】:Applying for loop to list of dataframes and calculate tables for each data frame in the list将for循环应用于数据框列表并为列表中的每个数据框计算表
【发布时间】:2016-12-09 04:34:13
【问题描述】:

这个问题可能看起来很初级,但我是一个绝对的 R 初学者,没有找到任何解决方案。

从一个实验中,我有来自 30 个受试者的大型数据文件,其中包含确切的图片名称和相应的反应时间。这 140 张图片属于 9 个不同的类别。

我从以下给定目录中读取了所有 CSV 文件:

temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i]))

这很好用。接下来,我需要在每个列表中复制变量“代码”,以免丢失原始信息。

lapply(mylist, transform, category=Code)

这可行,但“类别”列只是添加到我的列表中,而不是单独的数据框。

接下来,我需要将变量类别更改为字符,然后应用 for 循环,然后将它们转换回因子。 for 循环适用于单独的数据帧,但我怎样才能使它适用于列表中的每个数据帧? (这里我以数据框 Pb20_2 为例)

    for (i in 1:length(Pb20_2$category)){
  if (grepl("NonSocialNegative", Pb20_2$category[i])) Pb20_2$category[i] <- "1"
  if (grepl("NonSocialNeutral", Pb20_2$category[i])) Pb20_2$category[i] <- "2"
  if (grepl("NonSocialPositive", Pb20_2$category[i])) Pb20_2$category[i] <- "3"
}

for (i in 1:length(Pb20_2$category)){
  if (grepl("SocialNegative", Pb20_2$category[i])) Pb20_2$category[i] <- "4"
  if (grepl("SocialNeutral", Pb20_2$category[i])) Pb20_2$category[i] <- "5"
  if (grepl("SocialPositive", Pb20_2$category[i])) Pb20_2$category[i] <- "6"
  if (grepl("F_Face", Pb20_2$category[i])) Pb20_2$category[i] <- "7"
  if (grepl("N_Face", Pb20_2$category[i])) Pb20_2$category[i] <- "8"
  if (grepl("H_Face", Pb20_2$category[i])) Pb20_2$category[i] <- "9"
}

因子转换后,我需要计算每个类别的绝对命中数

Absolute=table(Pb20_2$category,Pb20_2$Type)
  • 同样适用于单个数据框 -

然后是相对数。

prop.table(Absolute,1)
  • 这也适用于单个数据帧。

那么,两者都应该包含在一个数据框中。

我还需要每个类别的平均反应时间。

try=tapply(Pb20_2$RT, Pb20_2$category, mean, na.rm=T )
  • 这同样适用于单个数据帧。

最后,我希望将所有主题放在一个数据框中,用变量“ID”对其进行排序,然后是 18 列:每个类别有两列,一列用于平均反应时间,另一列用于相对数量点击次数。

我可以为每个主题单独计算这个,然后最后将它们合并到一个数据帧中——我已经成功地做到了——但这需要很多时间,而且对于进一步的实验,我更喜欢一个简单的解决方案。

如果我的部分问题至少能得到一些答案或解决方案,我真的很高兴 - 感谢您的帮助!

最好的,

莎拉

【问题讨论】:

  • 查看一些数据会很有帮助。此外,您的 sn-ps 也不是太完整,因为 tapply()table() 不会返回容易适应数据框的值。如果可以,请在一个数据帧上显示完整的操作。

标签: r list csv for-loop


【解决方案1】:

为单独的 csv 文件聚合计算的最佳方法是在进入循环之前创建一个空数据框(将其分配给一个变量)。当您循环进行cbindrbind 的计算时,prop.table 会根据需要将结果堆叠到数据帧中。您可能需要对数据进行排序或使用键来合并数据而不是绑定数据。

如果您尝试对来自不同文件的内容进行排序并且它们具有不同的维度,这可能会很困难。在这种情况下,我会立即将所有 csv 文件放入一个或两个经过精心构造的巨大数据帧中,并在编写最终文件之前根据需要编写一个直接的方法来从那里进行排序和聚合。

如果你把它全部拉进去,编写代码会花费更长的时间,但它会更容易看到正在发生的事情并且更可重用。它可能会像循环一样快地运行。

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2021-08-15
    相关资源
    最近更新 更多