R 在第三列匹配的条件下,使用同一列中的值替换NAs

R 在第三列匹配的条件下,使用同一列中的值替换NAs,r,dplyr,apply,tidyr,R,Dplyr,Apply,Tidyr,对于给定的列,我需要用不同行的非NA值替换每行的NA 在var2列中,名称之间没有唯一的值。i、 e.可能有一个var2值在id之间共享 name<- rep(c("yygy","gryh","glqy","abye"),4) var2<- c(101,102,102,104,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA) data.frame(name,var2) name var2 1 yygy 101 2 gryh 10

对于给定的列,我需要用不同行的非NA值替换每行的NA

在var2列中,名称之间没有唯一的值。i、 e.可能有一个var2值在id之间共享

name<- rep(c("yygy","gryh","glqy","abye"),4)
var2<- c(101,102,102,104,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)
data.frame(name,var2)



     name var2
  1  yygy  101
  2  gryh  102
  3  glqy  102
  4  abye  104
  5  yygy   NA
  6  gryh   NA
  7  glqy   NA
  8  abye   NA
  9  yygy   NA
  10 gryh   NA
  11 glqy   NA
  12 abye   NA
  13 yygy   NA
  14 gryh   NA
  15 glqy   NA
  16 abye   NA
基本上,在上面的示例中,我希望在所有匹配的名称值上重复var2值,即对于yygy,将有四行,每行101

我原以为dplyr的连接函数会起作用,但没能实现。当然,这可以通过一个循环来完成,但理想的情况是寻找一个tidyr/dplyr方法或apply方法?

我们可以在按“name”分组后使用replace

library(dplyr)
df %>% 
  group_by(name)  %>% 
  mutate(var2 = replace(var2, is.na(var2), var2[!is.na(var2)]))
我们可以在按“名称”分组后使用替换

library(dplyr)
df %>% 
  group_by(name)  %>% 
  mutate(var2 = replace(var2, is.na(var2), var2[!is.na(var2)]))
您可以使用tidyr::fill:

您可以使用tidyr::fill:

在R底

df2 <- merge(df1[1],subset(df1,!is.na(var2),all.x=TRUE))

#    name var2
# 1  abye  104
# 2  abye  104
# 3  abye  104
# 4  abye  104
# 5  glqy  102
# 6  glqy  102
# 7  glqy  102
# 8  glqy  102
# 9  gryh  102
# 10 gryh  102
# 11 gryh  102
# 12 gryh  102
# 13 yygy  101
# 14 yygy  101
# 15 yygy  101
# 16 yygy  101
或维持秩序:

df2 <- merge(df1[1],subset(df1,!is.na(var2),all.x=TRUE)
             )[rank(df1$name,ties.method="first"),]
rownames(df2) <- NULL

#    name var2
# 1  yygy  101
# 2  gryh  102
# 3  glqy  102
# 4  abye  104
# 5  yygy  101
# 6  gryh  102
# 7  glqy  102
# 8  abye  104
# 9  yygy  101
# 10 gryh  102
# 11 glqy  102
# 12 abye  104
# 13 yygy  101
# 14 gryh  102
# 15 glqy  102
# 16 abye  104
资料

在R底

df2 <- merge(df1[1],subset(df1,!is.na(var2),all.x=TRUE))

#    name var2
# 1  abye  104
# 2  abye  104
# 3  abye  104
# 4  abye  104
# 5  glqy  102
# 6  glqy  102
# 7  glqy  102
# 8  glqy  102
# 9  gryh  102
# 10 gryh  102
# 11 gryh  102
# 12 gryh  102
# 13 yygy  101
# 14 yygy  101
# 15 yygy  101
# 16 yygy  101
或维持秩序:

df2 <- merge(df1[1],subset(df1,!is.na(var2),all.x=TRUE)
             )[rank(df1$name,ties.method="first"),]
rownames(df2) <- NULL

#    name var2
# 1  yygy  101
# 2  gryh  102
# 3  glqy  102
# 4  abye  104
# 5  yygy  101
# 6  gryh  102
# 7  glqy  102
# 8  abye  104
# 9  yygy  101
# 10 gryh  102
# 11 glqy  102
# 12 abye  104
# 13 yygy  101
# 14 gryh  102
# 15 glqy  102
# 16 abye  104
资料


谢谢。我在看帮助文件,它说它用前面的条目填充了行。所以我猜它工作的原因是,group_按名称对df进行排序……如果有一个名称的值丢失了呢?如果名称“glqy”最初在var2中是NA而不是“102”,那么在使用fill命令后,所有值都将保持NA。它不会使用名称“abye”中的值。啊,好的,太好了。谢谢有没有办法维持秩序或恢复到原来的秩序?我不认为有简单/干净的方法,但您可以执行类似df%>%mutateord=row_number%>%group_byname%>%fillvar2%>%arrangeord%>%的操作,如果有其他字段(如日期)可能是连续的,请选择ord或使用arrange。谢谢。我在查看帮助文件时,它说明用以前的条目填充行。所以我猜它工作的原因是,group_按名称对df进行排序……如果有一个名称的值丢失了呢?如果名称“glqy”最初在var2中是NA而不是“102”,那么在使用fill命令后,所有值都将保持NA。它不会使用名称“abye”中的值。啊,好的,太好了。谢谢有没有办法维持秩序或恢复到原来的秩序?我不认为有简单/干净的方法,但是你可以像df%>%mutateord=row_number%>%group_byname%>%fillvar2%>%arrangeord%>%这样做,如果有另一个像date这样的字段可能是连续的,那么选择ord或使用arrange。我想如果我的数据框中没有超过2个数据列,但却有,而且似乎因此而变得一团糟,那就可以了对不起,我应该说。谢谢你的意见。Sbha的答案似乎已经完成了任务。如果使用df1[-2]而不是df1[1]和subsetdf1[cname,var2],!is.navar2应该可以使用正确的列索引而不是2sbha。如果使用dplyr,我会使用它,并且我已经开始键入:,我只是提供了基本的替代方案。但它并没有保留顺序。我认为如果我的数据帧中没有超过2个数据列,这也没问题,但确实有,而且似乎因为它而混乱了。对不起,我应该说。谢谢你的意见。Sbha的答案似乎已经完成了任务。如果使用df1[-2]而不是df1[1]和subsetdf1[cname,var2],!is.navar2应该可以使用正确的列索引而不是2sbha。如果使用dplyr,我会使用它,并且我已经开始键入:,我只是提供了基本的替代方案。但这并不能维持秩序。