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



下面是我在R中的数据示例。"A 列has an assigned letter inB 列, and an assigned value inC 列. I want to add aD 列that records a ratio for each observation inA 列"中的每个观察结果。下面是观测值"1"比率的计算示例。

对于"1"的每个观察结果,我想计算表中出现未分配给"1"的所有x。在本例中,计数为 2,因为有两个 X 分配给观察值"3"。除了上述条件之外,我还想计算 X(未分配给观察值"1")的值大于6column C。计数为 1,因为分配给"3"的两个 X 中的一个在column C中的值大于 6。因此,在column D中,每个观测值"1"的比率是1比2:1/2。

我也想为column B的Y做事。

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中的每个观察,我未能生成跳过分配给该观察的X的nrow计数。

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

关于我如何修改它以将 X 从特定观察值 (column A) 中排除 X 以计算值大于 6 的比例的任何建议(column C

)谢谢!

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

## 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
}

最新更新