如何填充数据表列表中的一列

时间:2016-06-01 14:51:37

标签: r dataframe

我有一个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) 

我想应用一个函数,比如说summean不能在整个数据表中应用,因为有一些character列。

我尝试了lapply(mylist$y,sum)lapply(mylist[2],sum)的不同组合,但它不起作用。

3 个答案:

答案 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()如何处理它以了解其工作原理可能会很有趣。