运行 通过存储在列表 R 中的几个数据帧的条件
Running a conditional through several dataframes stored in a list R
我有一个具有以下格式的数据帧列表,我想 运行 有条件地通过:
IDn = c("ChrM", "ChrM" ,"ChrM" ,"ChrM" ,"ChrM")
posn = c(2,5,7,8,9)
met = c(2,0,4,1,0)
nmet = c(2,1,0,2,0)
bd = c(3,3,0,8,10)
dfp = data.frame(IDn,posn,met,nmet,bd)
IDn posn met nmet bd
1 ChrM 2 2 2 3
2 ChrM 5 0 1 3
3 ChrM 7 4 0 0
4 ChrM 8 1 2 8
5 ChrM 9 0 0 10
dfp[crit] <- (dfp[met]+dfp[nmet]>=4) & (dfp[met]>=dfp[bd])
问题是列表中的每个 df 都有不同的名称,存储在 names2
下
names2[crit] <- as.numeric((names2[met]+names2[nmet]>=4) & (names2[met]>=names2[bd]))
[crit]
是用于存储 0 或 1 值的新列。我尝试用 lapply
来 运行 这个,但到目前为止运气不好。有什么建议吗?
不确定您的 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)])
我们可以在没有任何匿名函数的情况下使用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)
我有一个具有以下格式的数据帧列表,我想 运行 有条件地通过:
IDn = c("ChrM", "ChrM" ,"ChrM" ,"ChrM" ,"ChrM")
posn = c(2,5,7,8,9)
met = c(2,0,4,1,0)
nmet = c(2,1,0,2,0)
bd = c(3,3,0,8,10)
dfp = data.frame(IDn,posn,met,nmet,bd)
IDn posn met nmet bd
1 ChrM 2 2 2 3
2 ChrM 5 0 1 3
3 ChrM 7 4 0 0
4 ChrM 8 1 2 8
5 ChrM 9 0 0 10
dfp[crit] <- (dfp[met]+dfp[nmet]>=4) & (dfp[met]>=dfp[bd])
问题是列表中的每个 df 都有不同的名称,存储在 names2
下names2[crit] <- as.numeric((names2[met]+names2[nmet]>=4) & (names2[met]>=names2[bd]))
[crit]
是用于存储 0 或 1 值的新列。我尝试用 lapply
来 运行 这个,但到目前为止运气不好。有什么建议吗?
不确定您的 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)])
我们可以在没有任何匿名函数的情况下使用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)