如何替换每个组的第一个值

时间:2019-01-11 12:49:29

标签: r dplyr

我的df如下:

set.seed(123)
df <- data.frame(x = sample(letters[1:3],20,replace = TRUE),
                 y = sample(1:10,20,replace = TRUE))
df <- df[order(df$x),]

我想用NA代替每个组的第一个值。例如:

x y
a NA
a 8
a 1
a 8
b NA
b 3
b 2
b 10
b 8
.
.

获取第一个值没有问题,但这没有意义。

test <- df %>% 
  group_by(x) %>% 
  do(a = head(.$y,1))

请帮助下一步。

2 个答案:

答案 0 :(得分:3)

使用dplyr,我们可以replace个值,其中row_number是1

library(dplyr)

df %>%
  group_by(x) %>%
  mutate(y = replace(y, row_number() == 1, NA))


#    x         y
#   <fct> <int>
# 1 a        NA
# 2 a         8
# 3 a         1
# 4 a         8
# 5 a         3
# 6 a         4
# 7 b        NA
# 8 b         6
# 9 b         3
#10 b         2
#....

或使用基数R ave

with(df, ave(y, x, FUN = function(i) replace(i, seq_along(i) == 1, NA)))
#[1] NA  8  1  8  3  4 NA  6  3  2 10  8 NA 10  7  6 10  7  5  3

答案 1 :(得分:2)

使用ifelse并使用临时变量(pos)来计算分组中的位置:

library(dplyr)
df %>% 
  group_by(x) %>% 
  mutate(pos = 1:n(), 
         y=ifelse(pos==1, NA, y)) %>% 
  select(-pos) %>% # remove this to see what's happening in the ifelse()
  head(8)
# # A tibble: 8 x 2
# # Groups:   x [2]
# x         y
# <fct> <int>
# 1 a        NA
# 2 a         8
# 3 a         1
# 4 a         8
# 5 a         3
# 6 a         4
# 7 b        NA
# 8 b         6