簡體   English   中英

R - 按行和列合並 dataframe

[英]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")

我們可以使用來自dcastreshape2data.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM