給定兩個資料框df1,df2如下所示:
df1:
df1 <- structure(list(A = 1L, B = 2L, C = 3L, D = 4L, G = 5L), class = "data.frame", row.names = c(NA,
-1L))
出去:
A B C D G
1 1 2 3 4 5
df2:
df2 <- structure(list(Col1 = c("A", "B", "C", "D", "X"), Col2 = c("E",
"Q", "R", "Z", "Y")), class = "data.frame", row.names = c(NA,
-5L))
出去:
Col1 Col2
1 A E
2 B Q
3 C R
4 D Z
5 X Y
我需要重命名df1using 的列df2,但 column 除外,G因為它不在df2's 中Col1。
我df2$Col2[match(names(df1), df2$Col1)]根據這里的答案使用,但它回傳"E" "Q" "R" "Z" NA,如您所見,列G變為NA. 我希望它保持原來的名字。
預期結果:
E Q R Z G
1 1 2 3 4 5
我該如何處理這個問題?謝謝。
uj5u.com熱心網友回復:
通過使用na.omit(有點亂..)
colnames(df1)[na.omit(match(names(df1), df2$Col1))] <- df2$Col2[na.omit(match(names(df1), df2$Col1))]
df1
E Q R Z G
1 1 2 3 4 5
我已成功重現您的錯誤
df2 <- data.frame(
Col1 = c("H","I","K","A","B","C","D"),
Col2 = c("a1","a2","a3","E","Q","R","Z")
)
問題是位置df2$Col1,并names(df1)在比賽。
na.omit(match(names(df1), df2$Col1))
給出[1] 4 5 6 7,其中不存在df1長度為 5 的索引。
對于df1,我們應該改變 中項的順序match,na.omit(match(df2$Col1,names(df1)))給出[1] 1 2 3 4
colnames(df1)[na.omit(match(df2$Col1, names(df1)))] <- df2$Col2[na.omit(match(names(df1), df2$Col1))]
這將起作用。
uj5u.com熱心網友回復:
使用包中的rename_with函式的解決方案dplyr。
library(dplyr)
df3 <- df2 %>%
filter(Col1 %in% names(df1))
df4 <- df1 %>%
rename_with(.cols = df3$Col1, .fn = function(x) df3$Col2[df3$Col1 %in% x])
df4
# E Q R Z G
# 1 1 2 3 4 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/349879.html
下一篇:在字典中迭代和存盤值
