我有一个dt
列表,结构相同,有些列numeric
有些characters
。
dt1 <- data.table(x = c(1:5), y = "test")
dt2 <- data.table(x = c(1:5), y = "test")
mylist <- list(A = dt1, B = dt2)
我想应用一个函数,比如说sum
或mean
不能在整个数据表中应用,因为有一些character
列。
我尝试了lapply(mylist$y,sum)
或lapply(mylist[2],sum)
的不同组合,但它不起作用。
答案 0 :(得分:3)
您可以在lapply
内创建一个匿名函数,在其中进行子集化并执行所需的计算(将我的评论推广到答案):
lapply(mylist, function(i) i[, sum(x)])
# or:
lapply(mylist, function(i) sum(i[["x"]]))
给出:
$A
[1] 76
$B
[1] 99
另一个示例为您提供x > 3
的唯一y值的数量:
lapply(mylist, function(i) i[x>3, uniqueN(y)])
给出:
$A
[1] 10
$B
[1] 14
使用过的数据:
dt1 <- data.table(x = c(1:5), y = letters)
dt2 <- data.table(x = c(1:7), y = letters)
mylist <- list(A = dt1, B = dt2)
答案 1 :(得分:1)
我真的认为purrr软件包可以让你更容易思考这些问题,让你把问题分解成一小块:
library(purrr)
dt1 <- data_frame(x = c(1:5), y = letters[1:5])
dt2 <- data_frame(x = c(1:5), y = letters[1:5])
mylist <- list(A = dt1, B = dt2)
map(mylist, "y") %>%
map(length)
你也可以使用这样的东西来有条件地应用一个功能
map(mylist, ~map_if(., is.numeric, sum))
答案 2 :(得分:-1)
您还可以使用嵌套的lapply()
函数,如下所示:
dt1 <- data.table(x = c(1:5), y = letters[1:5])
dt2 <- data.table(x = c(6:10), y = letters[1:5])
mylist <- list(A = dt1, B = dt2)
lapply(lapply(mylist, function(x) x[[1]]), mean)
# $A
# [1] 3
# $B
# [1] 8
这里看起来很多选项。使用我的代码,看看lapply()
返回什么以及另一个lapply()
如何处理它以了解其工作原理可能会很有趣。