r-插入基于其他行的缺失值



我有一个类似的数据帧(只是更长(。我的目标是将用户名[2]复制到[8]和[5]复制到[7]。我知道复制很奇怪,但这是有原因的。

我一直在尝试用一个"如果"来解决这个问题:

df$Username <- ifelse(df$Name == df$Name, df$Username, NA)

但它不起作用。我相信它相当简单,但在stackoverlow上找不到函数。提前感谢您的帮助。

# A tibble: 6 x 2
Name           Username       
<chr>          <chr>          
1 ZiadAboultaif  ziad_aboultaif 
2 ScottAitchison ScottAAitchison
3 DanAlbas       DanAlbas       
4 JohnAldag      jwaldag        
5 OmarAlghabra   OmarAlghabra   
6 ShafqatAli     Shafqat_Ali_1  
7 OmarAlghabra   NA
8 ScottAitchison NA
# Reproducilbe data:
df <- structure(list(Name = c("ZiadAboultaif", "ScottAitchison", "DanAlbas", 
"JohnAldag", "OmarAlghabra", "ShafqatAli"), Username = c("ziad_aboultaif", 
"ScottAAitchison", "DanAlbas", "jwaldag", "OmarAlghabra", "Shafqat_Ali_1"
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))

我会使用dplyr

df %>% group_by(Name) %>% 
mutate(Username=max(Username, na.rm=TRUE))

输出:

Name           Username       
<chr>          <chr>          
1 ZiadAboultaif  ziad_aboultaif 
2 ScottAitchison ScottAAitchison
3 DanAlbas       DanAlbas       
4 JohnAldag      jwaldag        
5 OmarAlghabra   OmarAlghabra   
6 ShafqatAli     Shafqat_Ali_1  
7 OmarAlghabra   OmarAlghabra   
8 ScottAitchison ScottAAitchison

mutate内部没有NAs(na.rm=TRUE(的情况下获得最大值。

一个可能的解决方案:

library(tidyverse)
df <- structure(list(Name = c("ZiadAboultaif", "ScottAitchison", "DanAlbas", 
"JohnAldag", "OmarAlghabra", "ShafqatAli"), Username = c("ziad_aboultaif", 
"ScottAAitchison", "DanAlbas", "jwaldag", "OmarAlghabra", "Shafqat_Ali_1"
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))
df <- rbind(df, c("OmarAlghabra", NA), c("ScottAitchison",NA))
df %>% 
group_by(Name) %>% 
fill(Username) %>% 
ungroup
#> # A tibble: 8 × 2
#>   Name           Username       
#>   <chr>          <chr>          
#> 1 ZiadAboultaif  ziad_aboultaif 
#> 2 ScottAitchison ScottAAitchison
#> 3 DanAlbas       DanAlbas       
#> 4 JohnAldag      jwaldag        
#> 5 OmarAlghabra   OmarAlghabra   
#> 6 ShafqatAli     Shafqat_Ali_1  
#> 7 OmarAlghabra   OmarAlghabra   
#> 8 ScottAitchison ScottAAitchison

我们可以使用dplyr包中的add_row

dplyr::add_row(df,df[c(5,2),], .after = 6)
Name           Username       
<chr>          <chr>          
1 ZiadAboultaif  ziad_aboultaif 
2 ScottAitchison ScottAAitchison
3 DanAlbas       DanAlbas       
4 JohnAldag      jwaldag        
5 OmarAlghabra   OmarAlghabra   
6 ShafqatAli     Shafqat_Ali_1  
7 OmarAlghabra   OmarAlghabra   
8 ScottAitchison ScottAAitchison

最新更新