如果与另一列中的重复条目相关联,则在该列上应用函数

时间:2018-11-15 19:28:12

标签: r

我有一个包含三个变量的数据集,如下所示,

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(),但不太确定如何将其合并。 谢谢!

3 个答案:

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