代码之家  ›  专栏  ›  技术社区  ›  MJZ

R: 有条件地应用于具有排除值的子集

  •  0
  • MJZ  · 技术社区  · 8 年前

    下面是我在 R .A列中的每个观察结果 has an assigned letter in B列 , and an assigned value in C列 . I want to add a D列 that records a ratio for each observation in 列A`。下面是观察值“1”的比率计算示例。

    对于“1”的每个观察值,我要计算 全部的 出现在表中但未分配给“1”的x。在这种情况下,计数为2,因为有两个X被分配给观测值“3”。除了上述条件之外,我还想用 值大于6 在里面 column C .计数为1,因为分配给“3”的两个X中有一个的值大于6英寸 C列 .因此,在 column D ,每个观测值“1”的比率为1除以2:1/2。

    我想为Y的加入做点什么 column B

    data_table
    Column A   Column B  Column C
     1           X         7
     1           X         8
     1           X         3
     1           X         3
     2           Y         3
     2           Y         8
     3           X         5
     3           X         7
     4           Y         6
     4           Y         7
     4           Y         8
    

    我希望生成的表如下所示:

    Column A  Column B  Column C Column D
     1           X         7      1/2     #There are two x's assigned to "3", and one of which has a value greater than 6 in column C.
     1           X         8      1/2
     1           X         3      1/2
     1           X         3      1/2
     2           Y         3      2/3
     2           Y         8      2/3
     3           X         5      2/4
     3           X         7      2/4
     4           Y         6      1/2
     4           Y         7      1/2
     4           Y         8      1/2
    

    以下是我迄今为止提出的代码,但对于 column A ,生成失败 nrow 跳过指定给的X的计数 这一观察结果

        final_df %>% group_by(column_B) %>% 
        mutate(ratio = nrow(filter(final_df, column_C>6))/nrow(final_df))
    

    有没有关于如何修改此选项以从特定观察中排除X的建议( A列 )计算值大于6(in)的X的比例时 C列 )

    非常感谢。

    1 回复  |  直到 8 年前
        1
  •  0
  •   kng229    8 年前

    像这样简单的事情怎么样?

    ## Simulate some data
    id1 <- rep(round(runif(250, 0,1)*100000000),each=4)
    id2 <- rep(round(runif(50, 0,1)*100000000),each=4)
    id2 <- rep(id2, each=5)
    value <- rnorm(1000, mean=6, sd=2)
    df <- data.frame(id1, id2, value)
    
    ## Calculate using a loop
    output <- data.frame(id1, id2, prop=NA)
    output <- output[!duplicated(output),]
    for(i in 1:nrow(output)){
        gt6 <- sum(df$value[df$id2!=output$id2[i]]>6)
        tot <- sum(df$id2!=output$id2[i])
        output$prop[i] <- gt6/tot
    }