【问题标题】:Apply function on each cell in a column and add the result to a new column对列中的每个单元格应用函数并将结果添加到新列
【发布时间】:2013-05-03 08:27:40
【问题描述】:

我有一个如下所示的 data.table。我想要的是对 C 列中的每个元素应用一个函数。该函数将接收一个向量(因为 Col C 包含向量元素)并返回另一个向量。这个结果向量应该被添加到一个新列中。

     A   B         C        
1:  16  151 c(2579, 2659, 2752)
2:  16  152 c(2580, 2660, 2753) 
3:  16  153 c(2581, 2661, 2754)
4:  16  154 c(2582, 2662, 2755)
5:  16  155 c(2583, 2663, 2756)
6:  16  156 c(2584, 2664, 2757)

例如,让我们考虑一个函数“isOdd”,它接受一个向量并返回一个逻辑向量。应用此函数后的输出表应如下所示

     A   B           C            isOdd
1:  16  151 c(2579, 2659, 2752)  c(T,T,F)
2:  16  152 c(2580, 2660, 2753)  c(F,F,T) 
3:  16  153 c(2581, 2661, 2754)  c(T,T,F)
4:  16  154 c(2582, 2662, 2755)  c(F,F,T)
5:  16  155 c(2583, 2663, 2756)  c(T,T,F)
6:  16  156 c(2584, 2664, 2757)  c(F,F,T)

我如何做到这一点?

【问题讨论】:

  • @MattDowle 的解决方案性能更高

标签: r data.table


【解决方案1】:

使用 R 的 apply 函数,我们可以轻松实现您的目标。假设 d 是您正在使用的 data.table 。基本上 lapply 将“C”列的每一行传递给匿名函数,然后将传入行的每个元素进一步传递给函数 isOdd。

isOdd <- function(x) {
    if (x %% 2 == 0) return("F") 
    else return("T")
}

d$isOdd <- lapply(d$C, function(x) sapply(x, isOdd))

【讨论】:

  • 这可能有效但不是惯用的data.table,由于嵌套的applys,我预计在扩展到更大的数据时会非常慢。
  • 这会很慢,请改用@MattDowle 的解决方案。
【解决方案2】:
DT = data.table(A=letters[1:3], B=list(1:3,4:6,7:8))
DT
   A     B   # notice B is list column containing vectors of different lengths
1: a 1,2,3   # it isn't a character vector, although it prints like one
2: b 4,5,6
3: c   7,8

> DT[,L:=sapply(B,length)][]
   A     B L
1: a 1,2,3 3
2: b 4,5,6 3
3: c   7,8 2

> isOdd = function (x) x%%2 == 0

> DT[,odd:=lapply(B,isOdd)][]
   A     B L              odd
1: a 1,2,3 3 FALSE,TRUE,FALSE
2: b 4,5,6 3  TRUE,FALSE,TRUE
3: c   7,8 2       FALSE,TRUE 

【讨论】:

  • 很好,但是 OP 想要一个矢量结果而不是一个列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多