我有兩個資料框,我試圖洗掉在其他資料框的列名中找不到名稱的行。
例如:
DF1
| 艾哈邁德 | 埃馬德 | 阿里 | |
|---|---|---|---|
| ---- | ---- | ---- | ---- |
| ---- | ---- | ---- | ---- |
| ---- | ---- | ---- | ---- |
DF2
| 名字 | |||
|---|---|---|---|
| 埃馬德 | -- | -- | |
| 艾哈邁德 | -- | -- | |
| 易卜拉欣 | -- | -- | |
| 薩阿德 | -- | -- | --- |
| 哈桑 | -- | -- | -- |
我正在嘗試洗掉名稱不在 DF2 名稱中的 DF1 列。
到目前為止我的代碼
library(dplyr)
`%notin%` <- Negate(`%in%`)
for ( i in seq_along(colnames(DF1))){
if (colnames(DF1)[i] %notin% rownames(DF2){
DF1=select(DF1,-i)
}
}
它完成了作業,但是它引發了這個錯誤:
錯誤:不能對不存在的列進行子集化。
如果再次運行代碼,它會洗掉“ahmed”和“emad”列,即使它們存在于 DF2 中!
uj5u.com熱心網友回復:
你的回圈的問題是你設定回圈遍歷所有列,但是你洗掉了列。當您到達第 20 列時,您已經洗掉了幾列并且不再有第 20 列!
但是你根本不需要回圈。
cols_to_keep = intersect(colnames(DF1), rownames(DF2))
DF1 = DF1[cols_to_keep]
uj5u.com熱心網友回復:
我們可以把 df1 變成長格式然后應用anti_join
library(dplyr)
library(tidyr)
df1_long <- df1 %>%
pivot_longer(
everything()
)
anti_join(df2, df1_long, by=c("names"="name"))
names
1 ibrahim
2 saad
3 hassan
資料:
df1 <- structure(list(ahmed = "a", emad = "b", ali = "c"), class = "data.frame", row.names = c(NA,
-1L))
df2 <- structure(list(names = c("emad", "ahmed", "ibrahim", "saad",
"hassan")), class = "data.frame", row.names = c(NA, -5L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/420944.html
標籤:
上一篇:洗掉減號前后不出現相同詞條的行
