R 在组中标识值并将其从一行复制到多行

R 在组中标识值并将其从一行复制到多行,r,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.',

我在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))
myDF试试这个:

你的数据 解决方案
my_df_final%
分组人(地址)%>%
排列(desc(Var1))%>%
每个变异(funs(na.locf),匹配(“Var”))%>%
解组%>%
排列(ID)%>%
as.data.frame()
我的期末考试
ID地址Var1 Var2
史密斯街1号真1号
2 Robin St.TRUE 1
3苹果街2号
4罗宾街真1号
史密斯街5号真1号
6紫色街假4
7罗宾街真1号
史密斯街8号真1
9大圣法尔斯8
10 10小圣法斯9
相同(my_df_最终版,myDF_预期版)
[1] 真的
尝试以下操作:

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

非常感谢。不幸的是,当我尝试使用实际数据运行此代码时,我收到了此错误消息:“错误:不兼容的大小(%d),预期为%d(组大小)或1”,如果解决方案在您的数据集上不起作用,则您提供的数据集不具有代表性。请提供一个,我会尝试找到一个新的解决方案。非常感谢。不幸的是,当我尝试使用实际数据运行此代码时,我收到了此错误消息:“错误:所有select()输入必须解析为整数列位置。”知道为什么或如何补救吗?您可以实际删除
%%>%select(ID、地址、Var1、Var2)
part,但列的顺序将与所需结果略有不同。
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
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