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()
是一个非常强大的函数,可以在不做假设的情况下学习源代码。