我需要用给定列的不同行的非NA值替换每行的NA。
在var2列中,我没有名称之间的唯一值。即,可以有一个在id上共享的var2值。
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方法还是应用?
答案 0 :(得分:4)
您可以使用tidyr::fill()
:
library(tidyr)
library(dplyr)
df %>%
group_by(name) %>%
fill(var2)
# A tibble: 16 x 2
# Groups: name [4]
name var2
<fctr> <dbl>
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
答案 1 :(得分:2)
我们可以在使用&#39; name&#39;
进行分组后使用replace
library(dplyr)
df %>%
group_by(name) %>%
mutate(var2 = replace(var2, is.na(var2), var2[!is.na(var2)]))
答案 2 :(得分:0)
在基地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
数据强>
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)
df1 <- data.frame(name,var2)