我一直以下列方式使用函数with
和ave
:
DT = within(DT,{sim1 = ave(sample, no, FUN = sample_ret)})
此函数采用data.table DT
并按变量no
对其进行细分。之后,它将函数sample_ret
应用于输入sample
,并在data.table中创建另一列sim1
。
有没有办法可以让函数接受多个输入?例如,我怎样才能让函数sample
与sample_ret
一起使用另一列?
sample
?
如果这不可能,还有其他功能可以实现我想要的吗?基本上,我想分割data.table并使用多个列作为输入应用函数?
例如,data.table DT
:
COL1 COL2 TYPE COL4
1 2 A 4
5 6 A 8
9 10 B 12
13 14 B 16
3 34 A 16
1 2 C 16
我希望按DT
对TYPE
进行细分,然后COL1
中有多少值大于6,每个COL2
中有多少值大于12 TYPE
。假设我有一个函数greater_than
,它包含两列并完全相同。如何使用ave
或其他替代方法完成我想要的工作?
答案 0 :(得分:3)
base R
选项
indx <- df1[1:2] >val[col(df1[1:2])]
rownames(indx) <- df1$TYPE
rowsum(indx+0L, row.names(indx))
# COL1 COL2
#A 0 1
#B 2 1
#C 0 0
或者
library(dplyr)
df1 %>%
group_by(TYPE) %>%
mutate_each(funs(.>df2$.), COL1:COL2) %>%
summarise_each(funs(sum), COL1:COL2)
# TYPE COL1 COL2
#1 A 0 1
#2 B 2 1
#3 C 0 0
@David Arenburg建议的可能data.table
选项
library(data.table)
cols <- paste0("COL", 1:2)
sums <- function(x, y) sum(x > y)
setDT(df1)[, Map(sums, .SD, val), by=TYPE, .SDcols = cols]
# TYPE COL1 COL2
#1: A 0 1
#2: B 2 1
#3: C 0 0
df1 <- structure(list(COL1 = c(1L, 5L, 9L, 13L, 3L, 1L), COL2 = c(2L,
6L, 10L, 14L, 34L, 2L), TYPE = c("A", "A", "B", "B", "A", "C"
), COL4 = c(4L, 8L, 12L, 16L, 16L, 16L)), .Names = c("COL1",
"COL2", "TYPE", "COL4"), class = "data.frame", row.names = c(NA,
-6L))
df2 <- data.frame(COL1=6, COL2= 12)
val <- c(6,12)