我在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的新手。非常感谢任何帮助。
答案 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