我有一个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)
我如何实现这一目标?
答案 0 :(得分:4)
使用R的应用功能,我们可以轻松实现您的目标。让我们说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))
答案 1 :(得分: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