簡體   English   中英

在data.frame中匹配多個變量

[英]match across more than one variable in a data.frame

取一些簡單的數據

A <- 1:10
B <- 100:109
C <- 222:231
df1 <- data.frame(A,B,C)
df1$Z <- 1:length(A)

D <- c(2,3,4,6)
E <- c(101,202,104,105)
Ff <- c(223,999,225,227)
df2 <- data.frame(D,E,Ff)

現在我想創建df2$Z ,當A == D且B == E和C == Ff時分配df1 $ D值,否則應用NA

我嘗試此代碼,但是語法不正確:

df2$Z <- df1$Z[match(df1$A & df2$D & df1$B & df2$E & df1$C & df2$Ff)]

使用data.table我會做類似的事情

library(data.table)
setkey(setDT(df2))[df1, Z := i.Z]
df2
#    D   E  Ff  Z
# 1: 2 101 223  2
# 2: 3 202 999 NA
# 3: 4 104 225 NA
# 4: 6 105 227  6

請注意,我們尚未在df1上設置鍵列,因此df1是在df2鍵列與df1的前3列之間執行的(即按位置)。 如果不能始終保證列順序,則也可以在相應列的df1上設置鍵。


完全不需要設置鍵的另一種方法(需要重新排序data.tables,這並不總是很理想)是使用新實現的on=參數(在CRAN的最新版本-1.9.6中可用):

library(data.table) # V 1.9.6+
setDT(df2)[df1, Z := i.Z, on = c(D = "A", E = "B", Ff = "C")]
df2
#    D   E  Ff  Z
# 1: 2 101 223  2
# 2: 3 202 999 NA
# 3: 4 104 225 NA
# 4: 6 105 227  6

左聯接很容易

library(dplyr)
final <- df2 %>% 
  left_join(df1, by = c("D" = "A", "E" = "B", "Ff" = "C")) %>% 
  select(-D, D = D.y)

tmp將包含來自原始df2 D和來自df1 Dy select(-D)刪除Dselect(D = Dy)Dy重命名為D select(-D, D = Dy)首先刪除D ,然后將Dy刪除為D ,得到所需的結果。

tmp <- df2 %>% 
  left_join(df1, by = c("D" = "A", "E" = "B", "Ff" = "C"))

您可以執行的Base R列的順序必須相同:

x = apply(df2,1,paste0, collapse='')
y = apply(df1[1:3],1, paste0, collapse='')

df2$Z = df1$Z[match(x,y)]

#  D   E  Ff  Z
#1 2 101 223  2
#2 3 202 999 NA
#3 4 104 225 NA
#4 6 105 227  6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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