【问题标题】:Add data to existing dataframe based on condition in R根据 R 中的条件将数据添加到现有数据框中
【发布时间】:2021-10-26 02:04:19
【问题描述】:

我有大量的 csv 文件。(超过 500 个 csv 文件) 目前我必须手动提取 1 x 1 csv 的特定单元格。并根据类别制作一个新的数据框。 下面是我导入数据、为每个 csv 特定单元格信息创建变量并创建新数据框的代码。

#Import the csv and create a list
tempx <- list.files(pattern ="*.csv")
mylist <- lapply(tempx,read_csv)

逐一创建变量,用于提取每个csv.file中的特定数据并删除零值

file1 <- mylist[[1]][132:167,4][apply(mylist[[1]][132:167,4], 1,
                                          function(row) all(row !=0 )), ] 


file2 <- mylist[[2][132:167,4][apply(mylist[[2][132:167,4], 1,
                                          function(row) all(row !=0 )), ] 

file3 <- mylist[[3]][132:167,4][apply(mylist[[3]][132:167,4], 1,
                                          function(row) all(row !=0 )), ]

file4 <- mylist[[3]][132:167,4][apply(mylist[[3]][132:167,4], 1,
                                          function(row) all(row !=0 )), ]

file5 <- mylist[[3]][132:167,4][apply(mylist[[3]][132:167,4], 1,
                                          function(row) all(row !=0 )), ]

创建一个不等长的数据框。


table <- qpcR:::cbind.na((file1,file3,file4,file5)
                                    

colnames(table) <- c("Name1" ,"Name2")

table1 <- as.data.frame(lapply(table ,as.numeric))  

上面的代码是我只能做的。手动创建这些变量file1file500 并根据该csv文件的第17行,第4列将变量1by1插入table数据框列。 (file105 示例:my list[[105]][17,4].)

是否可以使用if elsecase_when 将行添加到table1(现有数据框或创建新数据框)基于 mylist[[1]][17,4] 或 [1][17,4] 直到 [[500]][17,4] 等。 (最后,所有 500 个 csv 文件的数据框将是 10+ 列。)

就像if[[1]][17,4]="Name1",在[[1]][132:167,4] 中插入不为零值的table 列“Name1”。

图像 1 和图像 2 是一个 csv。 1 [数字 1 是我想成为列名的数据mylist[[1]][17,4] 2 [数字 2 是我想成为行mylist[[1]][132:167,4] 并根据mylist[[1]][17,4] 插入正确列的数据,不为零。`

图像 3 和图像 4 是一个 csv。 3&4 [数字 3 和 4 将是另一个与数字 1 和 2 相同的示例。

【问题讨论】:

  • filelist &lt;- lapply(mylist, function(x) { x[132:167,4][apply(x[132:167,4], 1, function(row) all(row !=0 )), ] }) 应该可以在列表中创建所有file* 对象。将filelist &lt;- lapply(mylist, function(x) { x[132:167,4][rowSums(x[132:167,4] == 0) == 0, ] }) 替换为apply 可能会更简洁一些。
  • 为了帮助您解决实际问题,如果有一个可复制/可粘贴的可重现示例并带有一些示例数据来说明,那就太好了。 2 或 3 个小样本数据框应该足以说明问题。
  • 您可以通过循环创建这些文件来自动创建file1、file2、file3等。首先,创建您的清单:outlist &lt;- vector(mode = "list", length = length(files)),然后填写:for (i in length(mylist)) {outlist[[i]] &lt;- mylist[[i]][132:167,4][apply(mylist[[i]][132:167,4], 1, function(row) all(row !=0 )), ]}。然后,您可以绑定列表:table &lt;- qpcR:::cbind.na((outlist)。但是如果没有可重现的例子,就很难确定它是否能正常工作。
  • 请查看最后2句上传4张图片供您参考。

标签: r dataframe csv if-statement


【解决方案1】:

我认为您可以为此使用循环。 我通常会在这里使用 purrr。 如果没有适当的可重现示例,很难完全正确。

library(purrr)
library(dplyr)

table1 <- map(my_list, ~ .x [132:167,4][apply(mylist[[1]][132:167,4], 1,
                                          function(row) all(row !=0 )), ]) %>%
    qpcR:::cbind.na()%>%
    set_names(~c("Name1" ,"Name2"))%>%
    as.data.frame()%>%
    mutate(across(everything(), as.numeric))
    

【讨论】:

  • 请查看最后2句上传4张图片供您参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多