使用第三列

时间:2018-03-29 11:58:46

标签: r dplyr apply tidyr

我需要用给定列的不同行的非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方法还是应用?

3 个答案:

答案 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)