首页 > 解决方案 > 使用 lapply 和 '[' 函数在数据框列表中选择列

问题描述

我有一个由大数据框(10000 行,25 列)拆分产生的 100 个数据框(100 行,25 列)的列表

对于我所有较小的数据框,我想从 25 列中选择 7 列。我使用lapplywith '['function :

Values_selected <- lapply(listdf, '[', c("Chemicals", "Begin.Date", "End.Date", "Less.Than", "Concentration", "Uncertainty.Value", "Measuring.Unit"))

“小于”列有 2 种可能性:“<”和“”(空)。因此,我希望获得 2 个新列表:

1 个 DF 列表,对于每个数据帧,包含在 Less.Than 中包含“<”的所有行;

1 个 DF 列表,对于每个数据帧,Less.Than 中所有不包含“<”的行

我试过这个:

Values_selected_AboveDL <- lapply(Values_selected, '[', ("Less.Than" == ""))
Values_selected_BelowDL <- lapply(Values_selected, '[', ("Less.Than" == "<"))

但是我得到了很奇怪的东西。列表列表Values_selected_AboveDL包含 100 行但 0 列的数据框......我的lapplyor '['函数有问题。如何修改查询以选择每个数据框中仅包含(或不包含)“<”列中的行 Less.Than ?

这些是我的数据:

List of 1496
 $ A110E.xxxx.CO2         :'data.frame':    13 obs. of  7 variables:
  ..$ Chemicals         : Factor w/ 53 levels "","CO2","CO2",..: 7 7 7 7 7 7 7 7 7 7 ...
  ..$ Begin.Date       : Factor w/ 368 levels "","2018-12-28",..: 4 32 60 88 116 144 172 199 227 255 ...
  ..$ End.Date         : Factor w/ 369 levels "","2018-12-29",..: 30 58 86 114 142 170 198 225 253 281 ...
  ..$ Less.Than        : Factor w/ 2 levels "","<": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ Concentration   : num [1:13] 0.00206 0.00276 0.00192 0.00362 0.00292 0.00174 0.0028 0.00245 0.00311 0.00278 ...
  ..$ Uncertainty.Value: num [1:13] 0.000537 0.000381 0.000508 0.000791 0.000675 0.00105 0.000375 0.000351 0.000532 0.000619 ...
  ..$ Measuring.Unit   : Factor w/ 7 levels "","Mol/G-C","Mol/KG",..: 6 6 6 6 6 6 6 6 6 6 ...
 $ A110E.xxxxx.CO      :'data.frame':   13 obs. of  7 variables:
  ..$ Chemicals         : Factor w/ 53 levels "","CO","CO",..: 9 9 9 9 9 9 9 9 9 9 ...
  ..$ Begin.Date       : Factor w/ 368 levels "","2018-12-28",..: 4 32 60 88 116 144 172 199 227 255 ...
  ..$ End.Date         : Factor w/ 369 levels "","2018-12-29",..: 30 58 86 114 142 170 198 225 253 281 ...
  ..$ Less.Than        : Factor w/ 2 levels "","<": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ Concentration   : num [1:13] 6.07e-05 8.57e-05 6.03e-05 1.04e-04 5.74e-05 9.20e-05 3.59e-05 6.82e-05 4.22e-05 1.05e-04 ...
  ..$ Uncertainty.Value: num [1:13] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Measuring.Unit   : Factor w/ 7 levels "","Mol/G-C","Mol/KG",..: 6 6 6 6 6 6 6 6 6 6 ...

标签: rselectlapply

解决方案


使用匿名函数清楚地表明我认为:

Values_selected_AboveDL <- lapply(Values_selected, function(x) x[x$Less.Than == "", ])
#Or
#Values_selected_AboveDL <- lapply(Values_selected, function(x) x[x$Less.Than != "<", ])
Values_selected_BelowDL <- lapply(Values_selected, function(x) x[x$Less.Than == "<", ])

如果没有匿名函数,您可以使用subset

Values_selected_AboveDL <- lapply(Values_selected, subset, Less.Than == "")
Values_selected_BelowDL <- lapply(Values_selected, subset Less.Than == "<")

使用可重现的示例mtcars

df <- mtcars
df$gear <- factor(df$gear)
Values_selected <- split(df, mtcars$cyl)
lapply(Values_selected, subset, gear == "3")

推荐阅读