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

4
我的数据框如下所示:
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个回答

12

使用dplyr,我们可以为第一行的值进行替换

library(dplyr)

df %>% group_by(x) %>% mutate(y = replace(y, 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, 1, NA)))
#[1] NA  8  1  8  3  4 NA  6  3  2 10  8 NA 10  7  6 10  7  5  3

3
使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接