我有以下兩個類似的資料框:
d1<-data.frame(TNR=c(1,2,3,4,5,6,7),EP=c(0,3,1,2,NA,NA,NA))
d2<-data.frame(TNR=c("E",1,3,5,100), EP=c(NA,NA,NA,NA,NA))
在 d2 中,向量“EP”為空,我想用來自 d1$EP 的資料填充它,其中向量 TNR 相互重疊。在它們不重疊的地方,我想保留 d2 而不是 d1。
結果應該是這樣的:
d3<-data.frame(TNR=c("E",1,3,5,100),EP=c(NA,0,1,NA,NA))
我用 ifelse 和 %in% 嘗試了以下方法:
d3<-data.frame(TNR=ifelse(test=d1$TNR %in% d2$TNR, yes=d2$EP, no=NA),
EP=ifelse(test=d1$TNR %in% d2$TNR, yes=d1$EP, no=""))
#remove rows where TNR is NA
d4=d3[!is.na(d1$baumnummer),]
但是,結果是 EP 以錯誤的順序插入,并且它似乎洗掉了比我預期更多的行,因為生成的資料幀比 d2 短
uj5u.com熱心網友回復:
那樣行嗎?
d2$EP <- d1[match(x = d2$TNR, table = d1$TNR), ]$EP
uj5u.com熱心網友回復:
你是這個意思嗎?
> d1 <- data.frame(TNR=as.character(c(1,2,3,4,5,6,7)),EP=c(0,3,1,2,NA,NA,NA))
> d2 <- data.frame(TNR=c('E',1,3,5,100))
> d3 <- merge(d1, d2, by = 'TNR', all = TRUE)
> d3
TNR EP
1 1 0
2 100 NA
3 2 3
4 3 1
5 4 2
6 5 NA
7 6 NA
8 7 NA
9 E NA
要排序,您可以使用order(). 有一些替代基本合并的方法可能略有不同:data.table::merge, dplyr:join_*
uj5u.com熱心網友回復:
我們可以用dplyr. 首先將 TNR 列轉換為字符,然后right_join是兩個資料幀。最后,我們可以使用coalesce合并EP列,消除 NA。
library(dplyr)
d1 %>%
mutate(TNR = as.character(TNR)) %>%
right_join(d2, by = "TNR") %>%
mutate(EP = coalesce(EP.x, EP.y), .keep = 'unused')
TNR EP
1 1 0
2 3 1
3 5 NA
4 E NA
5 100 NA
uj5u.com熱心網友回復:
我們可能會使用 {powerjoin}
library(powerjoin)
library(dplyr)
power_left_join(
d2,
mutate(d1, TNR = as.character(TNR)),
by = "TNR",
conflict = coalesce_yx
)
#> TNR EP
#> 1 E NA
#> 2 1 0
#> 3 3 1
#> 4 5 NA
#> 5 100 NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510792.html
上一篇:選擇不同表中相同條目的計數
