![](/img/trans.png)
[英]using an apply function with ggplot2 to create bar plots for more than one variable in a 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)
删除D
, select(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.