识别并将值从一行复制到组中的多行

时间:2015-11-08 19:33:20

标签: r

我在RStudio工作,我有一个类似于此的数据框:

myDF <- data.frame(ID =c(1,2,3,4,5,6,7,8,9,10),
                   Address = c('Smith St.','Robin St.','Apple St.', 
                   'Robin St.', 'Smith St.', 'Purple St.','Robin St.', 
                   'Smith St.', 'Big St.', 'Small St.'),
                   Var1 = c(TRUE,TRUE,FALSE,NA,NA,FALSE,NA,NA,FALSE,FALSE),
                   Var2 = c(1,1,2,NA,NA,4,NA,NA,8,9))

对于具有相同地址的每一行,我需要Var1和Var2相同(即,不应该有NA值)。因此,我需要一些方法来复制Var1和Var2的实际值(即非NA值),其中为每个地址给出具有相同地址的行,其中Var1和Var2被列为NA。例如,最终数据框应如下所示:

    myDF <- data.frame(ID =c(1,2,3,4,5,6,7,8,9,10),
                   Address = c('Smith St.','Robin St.','Apple St.', 
                   'Robin St.', 'Smith St.', 'Purple St.','Robin St.', 
                   'Smith St.', 'Big St.', 'Small St.'),
                   Var1 = c(TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,
                          FALSE),
                   Var2 = c(1,1,2,1,1,4,1,1,8,9))

我的实际数据框有超过14,000行和129个变量。我是R的新手。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

试试这个:

您的数据

myDF <- data.frame(ID =c(1,2,3,4,5,6,7,8,9,10),
                   Address = c('Smith St.','Robin St.','Apple St.', 
                               'Robin St.', 'Smith St.', 'Purple St.','Robin St.', 
                               'Smith St.', 'Big St.', 'Small St.'),
                   Var1 = c(TRUE,TRUE,FALSE,NA,NA,FALSE,NA,NA,FALSE,FALSE),
                   Var2 = c(1,1,2,NA,NA,4,NA,NA,8,9))

您的预期输出

myDF_expected <- 
  data.frame(ID =c(1,2,3,4,5,6,7,8,9,10),
           Address = c('Smith St.','Robin St.','Apple St.', 
                       'Robin St.', 'Smith St.', 'Purple St.','Robin St.', 
                       'Smith St.', 'Big St.', 'Small St.'),
           Var1 = c(TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,
                    FALSE),
           Var2 = c(1,1,2,1,1,4,1,1,8,9))

使用的库

library(dplyr)
library(zoo)

解决方案

my_df_final <-
  myDF %>% 
  group_by(Address) %>% 
  arrange(desc(Var1)) %>% 
  mutate_each(funs(na.locf), matches("Var")) %>%
  ungroup %>% 
  arrange(ID) %>% 
  as.data.frame()

my_df_final

   ID    Address  Var1 Var2
1   1  Smith St.  TRUE    1
2   2  Robin St.  TRUE    1
3   3  Apple St. FALSE    2
4   4  Robin St.  TRUE    1
5   5  Smith St.  TRUE    1
6   6 Purple St. FALSE    4
7   7  Robin St.  TRUE    1
8   8  Smith St.  TRUE    1
9   9    Big St. FALSE    8
10 10  Small St. FALSE    9

identical(my_df_final, myDF_expected)
[1] TRUE

答案 1 :(得分:0)

尝试以下方法:

library(dplyr)
inner_join(myDF["Address"], myDF[!is.na(myDF$Var1) & !is.na(myDF$Var2),], by = "Address") %>% mutate(ID = row_number()) %>% select(ID, Address, Var1, Var2)
   ID    Address  Var1 Var2
1   1  Smith St.  TRUE    1
2   2  Robin St.  TRUE    1
3   3  Apple St. FALSE    2
4   4  Robin St.  TRUE    1
5   5  Smith St.  TRUE    1
6   6 Purple St. FALSE    4
7   7  Robin St.  TRUE    1
8   8  Smith St.  TRUE    1
9   9    Big St. FALSE    8
10 10  Small St. FALSE    9