我有这样的数据框(特别是data.frame包含50列):
"G1" "G2" SEP11 ABCC1 0.1365 0.1858 214223_at ADAM19 0.1305 0.131 COPS4 BIK 0.1271 0.1143 ACE ALG3 0.1333 0.119 EMP3 GGH 0.1246 0.1214
和另一个像这样的data.frame(特别是data.frame包含50列):
"G1" "G2" 0.1365 0.1858 0.1271 0.1143 0.1246 0.1214
我想要以下输出:
"G1" "G2" SEP11 ABCC1 0.1365 0.1858 COPS4 BIK 0.1271 0.1143 EMP3 GGH 0.1246 0.1214
有人能帮帮我吗?
基本上,在R找到data.frame 1中的“0.1365”与data.frame2中的“0.1365”之间的匹配后,它将从与该匹配存在的数字相关联的data.frame1中提取相应的名称。这个数字也是因为我想回答这个问题:data.frame1中哪个元素与该数字相关联?
答案 0 :(得分:1)
df1 <- read.table(text=" G1 G2
SEP11 ABCC1
0.1365 0.1858
214223_at ADAM19
0.1305 0.131
COPS4 BIK
0.1271 0.1143
ACE ALG3
0.1333 0.119
EMP3 GGH
0.1246 0.1214",header=TRUE,stringsAsFactors=FALSE)
df2 <- read.table(text="G1 G2
0.1365 0.1858
0.1271 0.1143
0.1246 0.1214
",header=TRUE,stringsAsFactors=FALSE)
#separate names and numbers
df1a <- df1[seq(from=1,to=nrow(df1)-1,by=2),]
df1b <- df1[seq(from=2,to=nrow(df1),by=2),]
#look up and merge again
df <- rbind(df1b[apply(df1b,1,paste,collapse=",") %in% apply(df2,1,paste,collapse=","),],
df1a[apply(df1b,1,paste,collapse=",") %in% apply(df2,1,paste,collapse=","),])
df <- df[order(as.numeric(rownames(df))),]
# G1 G2
#1 SEP11 ABCC1
#2 0.1365 0.1858
#5 COPS4 BIK
#6 0.1271 0.1143
#9 EMP3 GGH
#10 0.1246 0.1214
答案 1 :(得分:0)
假设您的数据是成对的行,这应该有效:
您的数据:
df1 <- read.table(header = TRUE, text = ' "G1" "G2"
SEP11 ABCC1
0.1365 0.1858
214223_at ADAM19
0.1305 0.131
COPS4 BIK
0.1271 0.1143
ACE ALG3
0.1333 0.119
EMP3 GGH
0.1246 0.1214')
df2 <- read.table(header = TRUE, text = ' "G1" "G2"
0.1365 0.1858
0.1271 0.1143
0.1246 0.1214 ')
匹配指定数据和上一行的数据
myMatch <- which(df1$G1 %in% df2$G1)
myMatch <- sort(c(myMatch, myMatch-1))
子集化。
df1[myMatch, ]
# G1 G2
# 1 SEP11 ABCC1
# 2 0.1365 0.1858
# 5 COPS4 BIK
# 6 0.1271 0.1143
# 9 EMP3 GGH
# 10 0.1246 0.1214
借用Roland的方法,如果你试图匹配多个列,那么确实merge
可能是更合适的方法。不幸的是,您的数据目前不是允许轻松合并的形式,但也很容易修复:
通过分离名称和值以及data.frame
输出来“修复”您的“df1”cbind
。
df1.new <- cbind(df1[seq(from = 1, to = nrow(df1), by = 2), ],
df1[seq(from = 2, to = nrow(df1), by = 2), ])
重命名数据前半部分的列以指示它们是名称。下半部分数据的列将保留用于合并。
names(df1.new)[1:(ncol(df1.new)/2)] <-
paste(names(df1.new[1:(ncol(df1.new)/2)]), "Name", sep = ".")
df1.new
# G1.Name G2.Name G1 G2
# 1 SEP11 ABCC1 0.1365 0.1858
# 3 214223_at ADAM19 0.1305 0.131
# 5 COPS4 BIK 0.1271 0.1143
# 7 ACE ALG3 0.1333 0.119
# 9 EMP3 GGH 0.1246 0.1214
使用merge()
获取数据的“子集”。
merge(df1.new, df2)
# G1 G2 G1.Name G2.Name
# 1 0.1246 0.1214 EMP3 GGH
# 2 0.1271 0.1143 COPS4 BIK
# 3 0.1365 0.1858 SEP11 ABCC1
这种“更宽”的data.frame
可能会更方便您使用。