R语言 将一行的值替换为另一行的值

wj8zmpe1  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(198)
wave <-c(1, 2, 3, 1, 2, 3, 1, 2, 1, 2)

id   <-c(1, 1, 1, 2, 2, 2, 3, 3, 4, 4)

var1 <-c(6.341464, 13.206567, NA, 5.272296,2.746650, NA, 1.684472,1.874200, 15.861959, 3.938463)

var2 <-c(6.341464, 13.206567, NA, 5.272296,2.746650, NA, 1.684472,1.874200, 15.861959, 3.938463)

var3 <-c(6.341464, 13.206567, NA, 5.272296,2.746650, NA, 1.684472,1.874200, 15.861959, 3.938463)

df<- data.frame(wave,id,var1,var2,var3)

输出:df

**如何将wave 3中的NA替换为wave 2中的值?**应复制第二个wave中的所有值(也是NA)

我尝试了循环,但没有成功!

lp0sw83n

lp0sw83n1#

Base R的另一个选项是使用which查找wave 3的行索引,并使用-1\f25 index-1(索引)替换如下值:

df[which(wave == '3'),c("var1","var2","var3")] = df[which(wave == '3')-1,c("var1","var2","var3")]
df
#>    wave id      var1      var2      var3
#> 1     1  1  6.341464  6.341464  6.341464
#> 2     2  2 13.206567 13.206567        NA
#> 3     3  3 13.206567 13.206567        NA
#> 4     1  4  5.272296  5.272296  5.272296
#> 5     2  5  2.746650  2.746650  2.746650
#> 6     3  6  2.746650  2.746650  2.746650
#> 7     1  7  1.684472  1.684472  1.684472
#> 8     2  8  1.874200  1.874200  1.874200
#> 9     1  9 15.861959 15.861959 15.861959
#> 10    2 10  3.938463  3.938463  3.938463

创建于2023年3月18日,使用reprex v2.0.2
@TarJae的另一个选择,谢谢!

library(dplyr)
library(tidyr)
df %>% 
  filter(wave == 2 | wave == 3) %>%    
  fill(var1:var3, .direction = "down") %>%    
  bind_rows(df) %>%    
  distinct(id, .keep_all = TRUE) %>%    
  arrange(id)
#>    wave id      var1      var2      var3
#> 1     1  1  6.341464  6.341464  6.341464
#> 2     2  2 13.206567 13.206567        NA
#> 3     3  3 13.206567 13.206567        NA
#> 4     1  4  5.272296  5.272296  5.272296
#> 5     2  5  2.746650  2.746650  2.746650
#> 6     3  6  2.746650  2.746650  2.746650
#> 7     1  7  1.684472  1.684472  1.684472
#> 8     2  8  1.874200  1.874200  1.874200
#> 9     1  9 15.861959 15.861959 15.861959
#> 10    2 10  3.938463  3.938463  3.938463

旧答案,不同数据OP

你可以使用fill的向下方向,如下所示:

library(dplyr)
library(tidyr)
df %>%
  fill(var1:var3, .direction = 'down')
#>    wave id      var1      var2      var3
#> 1     1  1  6.341464  6.341464  6.341464
#> 2     2  2 13.206567 13.206567 13.206567
#> 3     3  3 13.206567 13.206567 13.206567
#> 4     1  4  5.272296  5.272296  5.272296
#> 5     2  5  2.746650  2.746650  2.746650
#> 6     3  6  2.746650  2.746650  2.746650
#> 7     1  7  1.684472  1.684472  1.684472
#> 8     2  8  1.874200  1.874200  1.874200
#> 9     1  9 15.861959 15.861959 15.861959
#> 10    2 10  3.938463  3.938463  3.938463

创建于2023年3月18日,使用reprex v2.0.2

相关问题