r - 使用 lapply 和 '[' 函数在数据框列表中选择列
问题描述
我有一个由大数据框(10000 行,25 列)拆分产生的 100 个数据框(100 行,25 列)的列表
对于我所有较小的数据框,我想从 25 列中选择 7 列。我使用lapply
with '['
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 列的数据框......我的lapply
or '['
函数有问题。如何修改查询以选择每个数据框中仅包含(或不包含)“<”列中的行 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 ...
解决方案
使用匿名函数清楚地表明我认为:
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")
推荐阅读
- sql - 至少一个对等点符合条件的行数
- c# - 在“错误的行”中抛出异常(C#、Windows 窗体、VS2017)
- python - 如何根据另一个数据框中的值替换数据框中的值?
- dask - 当文件无法从本地机器访问时使用 dask.dataframe 读取
- python-3.x - 更新链接模型的数据
- php - 时间戳将 PHP 格式化为给定的特定格式
- javascript - Google表格javascript的getMonth问题
- c# - C# 无法转换为“Microsoft.EntityFrameworkCore.DbContextOptions”
- linear-regression - 锚定线性回归通道 PineScript
- sql - 当有两列时,如何通过查询返回最大值?