R 按匹配模式合并文件
假设我有一个完整的模式文件,如:R 按匹配模式合并文件,r,R,假设我有一个完整的模式文件,如: pattern<-data.frame(x1=c(0,0,0,1,0,1,1,1), x2=c(0,0,1,0,1,1,0,1), x3=c(0,1,0,0,1,0,1,1), y=c(11,14, 12, 14, 16, 18, 19, 20)) pattern x1 x2 x3 y 1 0 0 0 11 2 0 0 1 14 3 0
pattern<-data.frame(x1=c(0,0,0,1,0,1,1,1),
x2=c(0,0,1,0,1,1,0,1),
x3=c(0,1,0,0,1,0,1,1),
y=c(11,14, 12, 14, 16, 18, 19, 20))
pattern
x1 x2 x3 y
1 0 0 0 11
2 0 0 1 14
3 0 1 0 12
4 1 0 0 14
5 0 1 1 16
6 1 1 0 18
7 1 0 1 19
8 1 1 1 20
a b c y
1 0 0 1 14
2 1 0 0 14
3 0 0 0 11
4 1 1 1 20
5 1 0 1 19
6 0 1 0 12
我想知道在R中是否有一种简单的方法可以做到这一点。一种方法是在将列粘贴在一起以与
交互匹配后使用match
,然后根据match中的数字索引获取y
值
indx1 <- as.character(interaction(df, sep=''))
indx2 <- as.character(interaction(pattern[,-4], sep=''))
df$y <- pattern$y[match(indx1, indx2)]
head(df)
# a b c y
#1 0 0 1 14
#2 1 0 0 14
#3 0 0 0 11
#4 1 1 1 20
#5 1 0 1 19
#6 0 1 0 12
或者使用data.table
library(data.table)
res1 <- setkey(setDT(pattern))[df] #suggested by @Arun
head(res1)
# x1 x2 x3 y
#1: 0 0 1 14
#2: 1 0 0 14
#3: 0 0 0 11
#4: 1 1 1 20
#5: 1 0 1 19
#6: 0 1 0 12
库(data.table)
res1一种方法是在将列粘贴在一起以与interaction
匹配后使用match
,然后根据match中的数字索引获取y
值
indx1 <- as.character(interaction(df, sep=''))
indx2 <- as.character(interaction(pattern[,-4], sep=''))
df$y <- pattern$y[match(indx1, indx2)]
head(df)
# a b c y
#1 0 0 1 14
#2 1 0 0 14
#3 0 0 0 11
#4 1 1 1 20
#5 1 0 1 19
#6 0 1 0 12
或者使用data.table
library(data.table)
res1 <- setkey(setDT(pattern))[df] #suggested by @Arun
head(res1)
# x1 x2 x3 y
#1: 0 0 1 14
#2: 1 0 0 14
#3: 0 0 0 11
#4: 1 1 1 20
#5: 1 0 1 19
#6: 0 1 0 12
库(data.table)
res11)合并在基本R中使用合并
:
merge(df, pattern, by = 1:3, all.x = TRUE, all.y = FALSE)
all.x=TRUE
表示保留df的所有行,即使它们不匹配;all.y=FALSE
表示不保留与df
的任何行不匹配的模式的行。all.x
和all.y
的组合是左连接
2)使用SQL的sqldf:
library(sqldf)
sqldf("select df.*, pattern.y from df
left join pattern on df.a = pattern.x1 and df.b = pattern.x2 and df.c = pattern.x3")
左连接保留左侧数据帧(df
)的所有行,但不保留右侧(pattern
)的所有行。1)合并在基本R中使用合并
:
merge(df, pattern, by = 1:3, all.x = TRUE, all.y = FALSE)
all.x=TRUE
表示保留df的所有行,即使它们不匹配;all.y=FALSE
表示不保留与df
的任何行不匹配的模式的行。all.x
和all.y
的组合是左连接
2)使用SQL的sqldf:
library(sqldf)
sqldf("select df.*, pattern.y from df
left join pattern on df.a = pattern.x1 and df.b = pattern.x2 and df.c = pattern.x3")
Left join保留左侧数据帧(df
)的所有行,但不保留右侧(pattern
)的所有行。您的标题显示“合并”。您是否尝试了merge
功能?未测试,但类似于:merge(df,pattern,by.x=names(df)[1:3],by.y=names(pattern)[1:3])
标题的可能副本显示“merge”。您是否尝试了merge
功能?未测试,但类似于:merge(df,pattern,by.x=names(df)[1:3],by.y=names(pattern)[1:3])
无需重命名列的可能重复项。请参见?left_join
:“要通过x和y上的不同变量进行连接,请使用命名向量。例如,by=c(“a”=“b”)
将x.a与y.b匹配。@Henrik感谢您的提示。从未使用过这种方式。或者:setkey(setDT(pattern))[df]
@Arun谢谢,非常有用。我在想df
必须转换成数据。table
。不用担心。debugonce()
是一个非常强大的函数,可以在不做假设的情况下学习源代码。无需重命名列。请参阅?left\u join
:“要通过x和y上的不同变量进行连接,请使用命名向量。例如,by=c(“a”=“b”)
将x.a与y.b匹配。@Henrik谢谢你的提示。从来没有这样使用过。或者:setkey(setDT(pattern))[df]
@Arun谢谢,非常有用。我在想,df
必须转换成data.table
。不用担心debugonce()
是一个非常强大的函数,可以在不做假设的情况下学习源代码。