![](/img/trans.png)
[英]Overwrite values from selected columns and matching rows from one data frame into another, R
[英]In R, how do I match values from selected rows in one data frame with selected columns in another?
我有兩個單獨的數據框。 一個數據框中的一些列與另一個數據框中的某些行具有相同的名稱。 如何將對應於一個 df 中幾行的值與對應於另一個 df 中幾列(與行同名)的值匹配?
在此示例中,我想知道對於第一個 df 中的每一行,每個問題 (E4Q_) 下的值 (A/B/C/D) 是否與 df2 中 E4Q_ 行和“Answer”列的值匹配。 在此之后,我想在第三個數據框中打印 TRUE/FALSE 或 1/0,該數據框中的設置與第一個類似。
df1:
Name E4Q1 E4Q2 E4Q3 E4Q4 E4Q5
XYZ B B A A B
DEF D D D C B
GHJ - - B A C
df2:
Question Answer
E4Q1 B
E4Q2 D
E4Q3 C
E4Q4 A
E4Q5 C
df3:
Name E4Q1 E4Q2 E4Q3 E4Q4 E4Q5
XYZ 1 0 0 1 0
DEF 0 1 0 0 0
GHJ 0 0 0 1 1
如果您使用的是 R 的當前版本,則默認使用 stringsAsFactos=FALSE。 這個任務是一個很好的例子,說明為什么要做出改變。 Factos 會使這個過程完全復雜化。 如果您像我一樣,則需要使用明確設置的數據輸入:
df1 <- read.table(text= "Name E4Q1 E4Q2 E4Q3 E4Q4 E4Q5
XYZ B B A A B
DEF D D D C B
GHJ - - B A C", head=TRUE,stringsAsFactors=FALSE)
df2 <- read.table(text=" Question Answer
E4Q1 B
E4Q2 D
E4Q3 C
E4Q4 A
E4Q5 C", head=TRUE,stringsAsFactors=FALSE)
df3 <- df1 # same structure but Question columns will be changed to 1/0
首先嘗試:遍歷列名稱並將結果與 df2 中的正確值進行比較:
for( i in names(df1[-1]) ){ df3[[i]] <- df1[[i]] == df2[df2$Question==i, 2] }
df3
Name E4Q1 E4Q2 E4Q3 E4Q4 E4Q5
1 XYZ TRUE FALSE FALSE TRUE FALSE
2 DEF FALSE TRUE FALSE FALSE FALSE
3 GHJ FALSE FALSE FALSE TRUE TRUE
所以需要強制轉換為數字,要么使用 as.numeric 要么添加 0。
for( i in names(df1[-1]) ){ df3[[i]] <- ( df1[[i]] == df2[df2$Question==i, 2])+0 }
df3
Name E4Q1 E4Q2 E4Q3 E4Q4 E4Q5
1 XYZ 1 0 0 1 0
2 DEF 0 1 0 0 0
3 GHJ 0 0 0 1 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.