[英]R - Merging dataframe by row and column
我想將 dataframe 從長格式轉換為寬格式,這是一項額外的小任務。 我也想將它合並到另一個 dataframe 中。
所以這是我的原始 df,我可以將其轉換為寬格式。
V1 V2 V3
1 A IIA 1
2 A S1MU 5
3 A AMU 3
4 C IIU 6
5 C IMA 7
6 A S2FU 8
7 B S1MU 9
8 A IIU 13
9 B S1II 7
10 C S1II 9
11 D IMA 4
12 A S1II 3
reshape(testframe, idvar = "V1", timevar = "V2", direction = "wide")
V1 V3.IIA V3.S1MU V3.AMU V3.IIU V3.IMA V3.S2FU V3.S1II
1 A 1 5 3 13 NA 8 3
4 C NA NA NA 6 7 NA 9
7 B NA 9 NA NA NA NA 7
11 D NA NA NA NA 4 NA NA
現在我想將轉換后的 dataframe 添加到這個 dataframe 中:
Code IIA S1MU AMU IIU IMA S2FU S1II IFA BIA
1 A NA NA NA NA NA NA NA NA NA
2 B NA NA NA NA NA NA NA NA NA
3 C NA NA NA NA NA NA NA NA NA
4 D NA NA NA NA NA NA NA NA NA
它的列比這個例子需要的多,實際上我有更多,最后兩列也將被填充。 所以我必須匹配正確的代碼和正確的列名。
任何想法我怎么能做到這一點?
測試框架:
structure(list(V1 = c("A", "A", "A", "C", "C", "A", "B", "A",
"B", "C", "D", "A"), V2 = c("IIA", "S1MU", "AMU", "IIU", "IMA",
"S2FU", "S1MU", "IIU", "S1II", "S1II", "IMA", "S1II"), V3 = c(1,
5, 3, 6, 7, 8, 9, 13, 7, 9, 4, 3)), row.names = c(NA, -12L), class = "data.frame")
新框架:
structure(list(Code = c("A", "B", "C", "D"), IIA = c(NA, NA,
NA, NA), S1MU = c(NA, NA, NA, NA), AMU = c(NA, NA, NA, NA), IIU = c(NA,
NA, NA, NA), IMA = c(NA, NA, NA, NA), S2FU = c(NA, NA, NA, NA
), S1II = c(NA, NA, NA, NA), IFA = c(NA, NA, NA, NA), BIA = c(NA,
NA, NA, NA)), row.names = c(NA, -4L), class = "data.frame")
我們可以使用來自dcast
或reshape2
的data.table
。 如果我們需要“newframe”中其他缺失的列,只需將那些在 output 中找不到但僅在“newframe”中找到的列名稱分配給NA
,然后將列順序更改為“newframe”中的列順序
library(data.table)
out <- dcast(setDT(df1), V1 ~ V2, value.var = 'V3')
setnames(out, 'V1', 'Code')
out[, setdiff(names(newframe), names(out)) := NA_real_]
setcolorder(out, names(newframe))
-輸出
> out
Code IIA S1MU AMU IIU IMA S2FU S1II IFA BIA
1: A 1 5 3 13 NA 8 3 NA NA
2: B NA 9 NA NA NA NA 7 NA NA
3: C NA NA NA 6 7 NA 9 NA NA
4: D NA NA NA NA 4 NA NA NA NA
或者如果我們想使用基於索引的base R
,創建一個行名列並使用行名/列名進行子集化
out <- xtabs(V3 ~ V1 + V2, df1)
out[out == 0] <- NA
tmp <- as.matrix(`row.names<-`(newframe[-1], newframe$Code))
tmp[row.names(out), colnames(out)] <- out
-輸出
> tmp
IIA S1MU AMU IIU IMA S2FU S1II IFA BIA
A 1 5 3 13 NA 8 3 NA NA
B NA 9 NA NA NA NA 7 NA NA
C NA NA NA 6 7 NA 9 NA NA
D NA NA NA NA 4 NA NA NA NA
你可以使用tidyverse
:
library(tidyverse)
testframe %>%
rename(Code = V1) %>%
pivot_wider(Code, V2, values_from = V3) %>%
coalesce(newframe)
# A tibble: 4 x 10
Code IIA S1MU AMU IIU IMA S2FU S1II IFA BIA
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl> <lgl>
1 A 1 5 3 13 NA 8 3 NA NA
2 C NA NA NA 6 7 NA 9 NA NA
3 B NA 9 NA NA NA NA 7 NA NA
4 D NA NA NA NA 4 NA NA NA NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.