嗨,我正在研究如何按列將資料幀匹配在一起,然后重命名它。如果沒有匹配的名稱,那么我想洗掉該列。
例如,我會使用這個主資料集,稱之為 DF1:
| 姓名 | 參考 | 好的 | 公平的 | 壞的 | 偉大的 | 貧窮的 |
|---|---|---|---|---|---|---|
| 喬治 | 爬坡道 | 34 | 21 | 33 | 21 | 32 |
| 坦率 | 樓梯 | 29 | 28 | 29 | 30 | 29 |
| 伯莎 | 蹤跡 | 25 | 25 | 24 | 21 | 26 |
然后是另一個 DF,稱為 DF2,它允許我替換 DF1 的列的名稱
| 姓名 | Adjusted_Name |
|---|---|
| 好的 | 好運行 |
| 偉大的 | 非常偉大的作業 |
| 壞的 | 糟糕的運行 |
| 公平的 | 公平運行 體面 |
本質上,將被替換的單詞不會是任何型別的任何模式,我會嘗試匹配 DF2 中的第一列并匹配 DF1,如果 DF2$Name 和 DF (無論哪一列)匹配,然后我會用同一行 DF2$Adjusted_Name 替換該名稱。如果沒有匹配,則洗掉 DF1 中的值。
所以最終目標是實作:
| 姓名 | 參考 | 好運行 | 公平運行 體面 | 運行不良 | 非常偉大的作業 |
|---|---|---|---|---|---|
| 喬治 | 爬坡道 | 34 | 21 | 33 | 21 |
| 坦率 | 樓梯 | 29 | 28 | 29 | 30 |
| 伯莎 | 蹤跡 | 25 | 25 | 24 | 21 |
在這種情況下,“差”被洗掉,因為它與 DF1 的列名不匹配。
我該怎么辦?如果有數千列,我將如何計算?這會改變我的編碼方式嗎?我對 R 有點陌生,如果有任何提示,我將不勝感激。謝謝!
uj5u.com熱心網友回復:
如果您愿意接受tidyverse解決方案,您可以使用
library(dplyr)
library(tibble)
df %>%
rename_with(~deframe(df2)[.x], .cols = df2$Name) %>%
select(Name, Reference, any_of(df2$Adjusted_Name))
這回傳
# A tibble: 3 x 6
Name Reference good_run very_great_work bad_run fair_run_decent
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 George Hill 34 21 33 21
2 Frank Stairs 29 30 29 28
3 Bertha Trail 25 21 24 25
資料
df <- structure(list(Name = c("George", "Frank", "Bertha"), Reference = c("Hill",
"Stairs", "Trail"), Good = c(34, 29, 25), Fair = c(21, 28, 25
), Bad = c(33, 29, 24), Great = c(21, 30, 21), Poor = c(32, 29,
26)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA,
-3L), spec = structure(list(cols = list(Name = structure(list(), class = c("collector_character",
"collector")), Reference = structure(list(), class = c("collector_character",
"collector")), Good = structure(list(), class = c("collector_double",
"collector")), Fair = structure(list(), class = c("collector_double",
"collector")), Bad = structure(list(), class = c("collector_double",
"collector")), Great = structure(list(), class = c("collector_double",
"collector")), Poor = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"))
df2 <- structure(list(Name = c("Good", "Great", "Bad", "Fair"), Adjusted_Name = c("good_run",
"very_great_work", "bad_run", "fair_run_decent")), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L), spec = structure(list(
cols = list(Name = structure(list(), class = c("collector_character",
"collector")), Adjusted_Name = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"))
uj5u.com熱心網友回復:
嘗試以下操作 - 使用調整后的名稱串列,您可以grep根據列名列出所需單詞的串列,并對其上的資料框進行子集化:
資料
df <- read.table(header = TRUE, text = "Name Reference Good Fair Bad Great Poor
George Hill 34 21 33 21 32
Frank Stairs 29 28 29 30 29
Bertha Trail 25 25 24 21 26")
adj_name <- c("good_run","very_great_run","bad run","fair run decent")
grep根據所需名稱的字串索引列(還要注意tolower()列名上的)
desired_words <- paste(unlist(strsplit(adj_name, "_| ")), collapse = "|")
df[,c(1:2,grep(desired_words, tolower(names(df))))]
輸出
# Name Reference Good Fair Bad Great
#1 George Hill 34 21 33 21
#2 Frank Stairs 29 28 29 30
#3 Bertha Trail 25 25 24 21
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/463625.html
上一篇:根據名稱匹配用另一個資料框替換列
