R - 内部和大道使用多个输入

时间:2015-05-31 07:01:09

标签: r

我一直以下列方式使用函数withave

DT = within(DT,{sim1 = ave(sample, no, FUN = sample_ret)})

此函数采用data.table DT并按变量no对其进行细分。之后,它将函数sample_ret应用于输入sample,并在data.table中创建另一列sim1

有没有办法可以让函数接受多个输入?例如,我怎样才能让函数samplesample_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

我希望按DTTYPE进行细分,然后COL1中有多少值大于6,每个COL2中有多少值大于12 TYPE。假设我有一个函数greater_than,它包含两列并完全相同。如何使用ave或其他替代方法完成我想要的工作?

1 个答案:

答案 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)