R 在第三列匹配的条件下,使用同一列中的值替换NAs
对于给定的列,我需要用不同行的非NA值替换每行的NA 在var2列中,名称之间没有唯一的值。i、 e.可能有一个var2值在id之间共享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
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,我会使用它,并且我已经开始键入:,我只是提供了基本的替代方案。但这并不能维持秩序。