通过存储在列表R中的多个数据帧运行条件

时间:2016-02-09 19:02:52

标签: r list dataframe conditional lapply

我有一个数据帧列表,其格式如下,我想通过以下方式运行条件:

names2[crit] <- as.numeric((names2[met]+names2[nmet]>=4) & (names2[met]>=names2[bd]))

事实上,列表中的每个df都有一个不同的名称,存储在names2

[crit]

lapply是一个存储0或1值的新列。我尝试用{{1}}来运行它,但到目前为止没有运气。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

不确定您的lapply代码出了什么问题(将您尝试过的代码包含在问题中总是好的),但以下内容应该有效:

# creating a list
dflist <- list(d1=dfp, d2=dfp)

# updating the dataframes in your list
dflist <- lapply(dflist, function(x) {x$crit <- (x$met + x$nmet >= 4) & (x$met>=x$bd); x})

# or:
dflist <- lapply(dflist, function(x) {cbind(x, crit = (x$met + x$nmet >= 4) & (x$met>=x$bd))})

导致以下列表:

> dflist
$d1
   IDn posn met nmet bd  crit
1 ChrM    2   2    2  3 FALSE
2 ChrM    5   0    1  3 FALSE
3 ChrM    7   4    0  0  TRUE
4 ChrM    8   1    2  8 FALSE
5 ChrM    9   0    0 10 FALSE

$d2
   IDn posn met nmet bd  crit
1 ChrM    2   2    2  3 FALSE
2 ChrM    5   0    1  3 FALSE
3 ChrM    7   4    0  0  TRUE
4 ChrM    8   1    2  8 FALSE
5 ChrM    9   0    0 10 FALSE

回应你的评论:

当您使用 data.table 时,您还可以使用:

dflist <- lapply(dflist, function(x) x[, crit := (met + nmet >= 4) & (met>=bd)])

答案 1 :(得分:0)

我们可以使用transform而不使用任何匿名函数

 lapply(dflist, transform, crit = (met + nmet)>=4 & (met >=bd))
#  $d1
#   IDn posn met nmet bd  crit
#1 ChrM    2   2    2  3 FALSE
#2 ChrM    5   0    1  3 FALSE
#3 ChrM    7   4    0  0  TRUE
#4 ChrM    8   1    2  8 FALSE
#5 ChrM    9   0    0 10 FALSE

#$d2
#   IDn posn met nmet bd  crit
#1 ChrM    2   2    2  3 FALSE
#2 ChrM    5   0    1  3 FALSE
#3 ChrM    7   4    0  0  TRUE
#4 ChrM    8   1    2  8 FALSE
#5 ChrM    9   0    0 10 FALSE

使用dplyr/purrr的另一个选项是

library(dplyr)
library(purrr)
dflist %>%
        map(~mutate(., crit=(met+nmet)>=4 & (met >=bd)))
#$d1
#   IDn posn met nmet bd  crit
#1 ChrM    2   2    2  3 FALSE
#2 ChrM    5   0    1  3 FALSE
#3 ChrM    7   4    0  0  TRUE
#4 ChrM    8   1    2  8 FALSE
#5 ChrM    9   0    0 10 FALSE

#$d2
#   IDn posn met nmet bd  crit
#1 ChrM    2   2    2  3 FALSE
#2 ChrM    5   0    1  3 FALSE
#3 ChrM    7   4    0  0  TRUE
#4 ChrM    8   1    2  8 FALSE
#5 ChrM    9   0    0 10 FALSE

数据

dflist <- list(d1=dfp, d2=dfp)