我有一个包含三个变量的数据集,如下所示,
x=data.frame("a"=c(1,1,2,3),"b"=c("a","b","c","d"),"c"=c(100,100,200,300))
如果对于“ a”的相同值,存在“ n”个不同的b值,我想将我的“ c”值除以该“ n”。也就是说,我想要这样的输出,
x=data.frame("a"=c(1,1,2,3),"b"=c("a","b","c","d"),"c"=c(50,50,200,300))
我知道我可以尝试duplicated()
,但不太确定如何将其合并。
谢谢!
答案 0 :(得分:3)
替代方法:
library(data.table)
as.data.table(x)[, c := c/.N, by="a"][]
# a b c
# 1: 1 a 50
# 2: 1 b 50
# 3: 2 c 200
# 4: 3 d 300
另一个基数R:
r <- rle(x$a)$lengths
transform(x, c = c/rep(r,r))
# a b c
# 1 1 a 50
# 2 1 b 50
# 3 2 c 200
# 4 3 d 300
答案 1 :(得分:3)
在基数R中,您可以使用ave()
。
transform(x, c = c / ave(a, a, FUN = length))
# a b c
# 1 1 a 50
# 2 1 b 50
# 3 2 c 200
# 4 3 d 300
答案 2 :(得分:2)
我们将'a'分组,然后将'c'除以'b'中的n_distinct
(唯一元素数)
library(dplyr)
x %>%
group_by(a) %>%
mutate(c= c/n_distinct(b))
# A tibble: 4 x 4
# Groups: a [3]
# a b c new
# <dbl> <fct> <dbl> <dbl>
#1 1 a 100 50
#2 1 b 100 50
#3 2 c 200 200
#4 3 d 300 300
请注意,以上内容基于OP的描述(If for same value of "a", there are "n" different b values
)。但是,如果OP表示different
是元素总数而不是不同的值,那么它将是n_distinct
而不是n()
。在这里,尚不清楚,因为这两个条件都可以工作
x %>%
group_by(a) %>%
mutate(c = c/n())
或使用base R
x$c <- x$c/rowSums(table(x[1:2]) > 0)[as.character(x$a)]