如何根据使用 R 在另一个数据框中的行中找到的值为数据框中的每一行分配明确的值?
How to assign unambiguous values for each row in a data frame based on values found in rows from another data frame using R?
这几天我一直在为这个问题苦苦思索。
我需要扫描数据框中的每一行,然后根据在第二个数据框中找到的值为每一行分配一个唯一标识符。这是一个玩具示例。
df1<-data.frame(c(99443975,558,99009680,99044573,599,99172478))
names(df1)<-"Building"
V1<-c(558,134917,599,120384)
V2<-c(4400796,14400095,99044573,4500481)
V3<-c(NA,99009680,99340705,99132792)
V4<-c(NA,99156365,NA,99132794)
V5<-c(NA,99172478,NA, 99181273)
V6<-c(NA, NA, NA,99443975)
row_number<-1:4
df2<-data.frame(cbind(V1, V2,V3,V4,V5,V6, row_number))
我期望的输出如下。
row_number_assigned<-c(4,1,2,3,3,2)
output<-data.frame(cbind(df1, row_number_assigned))
有什么提示吗?
您可以使用 tidyverse
方法:
library(dplyr)
library(tidyr)
df1 %>%
left_join(df2 %>%
pivot_longer(-row_number) %>%
select(-name),
by = c("Building" = "value"))
这个returns
Building row_number
1 99443975 4
2 558 1
3 99009680 2
4 99044573 3
5 599 3
6 99172478 2
下面是一个使用which
函数的arr.ind
特性的有效方法:
sapply( df1$Building, # will send Building entries one-by-one
function(inp){ which(inp == df2, # find matching values
arr.in=TRUE)[1]}) # return only row; not column
[1] 4 1 2 3 3 2
顺便说一句,您使用 data.frame(cbind(.))
结构非常危险。一种危险性小得多且使用更少击键的数据框构建方法是:
df2<-data.frame( V1=c(558,134917,599,120384),
V2=c(4400796,14400095,99044573,4500481),
V3=c(NA,99009680,99340705,99132792),
V4=c(NA,99156365,NA,99132794),
V5=c(NA,99172478,NA, 99181273),
V6=c(NA, NA, NA,99443975) )
(这次没有导致编码错误,但如果有任何字符列,它会将所有数字更改为字符值。)如果你是从老师那里学到的,你能不能以某种方式轻轻地接近他们并做他们的未来的学生帮个忙,让他们知道 cbind()
会将所有论点强制转换为“最小公分母”。
这几天我一直在为这个问题苦苦思索。 我需要扫描数据框中的每一行,然后根据在第二个数据框中找到的值为每一行分配一个唯一标识符。这是一个玩具示例。
df1<-data.frame(c(99443975,558,99009680,99044573,599,99172478))
names(df1)<-"Building"
V1<-c(558,134917,599,120384)
V2<-c(4400796,14400095,99044573,4500481)
V3<-c(NA,99009680,99340705,99132792)
V4<-c(NA,99156365,NA,99132794)
V5<-c(NA,99172478,NA, 99181273)
V6<-c(NA, NA, NA,99443975)
row_number<-1:4
df2<-data.frame(cbind(V1, V2,V3,V4,V5,V6, row_number))
我期望的输出如下。
row_number_assigned<-c(4,1,2,3,3,2)
output<-data.frame(cbind(df1, row_number_assigned))
有什么提示吗?
您可以使用 tidyverse
方法:
library(dplyr)
library(tidyr)
df1 %>%
left_join(df2 %>%
pivot_longer(-row_number) %>%
select(-name),
by = c("Building" = "value"))
这个returns
Building row_number
1 99443975 4
2 558 1
3 99009680 2
4 99044573 3
5 599 3
6 99172478 2
下面是一个使用which
函数的arr.ind
特性的有效方法:
sapply( df1$Building, # will send Building entries one-by-one
function(inp){ which(inp == df2, # find matching values
arr.in=TRUE)[1]}) # return only row; not column
[1] 4 1 2 3 3 2
顺便说一句,您使用 data.frame(cbind(.))
结构非常危险。一种危险性小得多且使用更少击键的数据框构建方法是:
df2<-data.frame( V1=c(558,134917,599,120384),
V2=c(4400796,14400095,99044573,4500481),
V3=c(NA,99009680,99340705,99132792),
V4=c(NA,99156365,NA,99132794),
V5=c(NA,99172478,NA, 99181273),
V6=c(NA, NA, NA,99443975) )
(这次没有导致编码错误,但如果有任何字符列,它会将所有数字更改为字符值。)如果你是从老师那里学到的,你能不能以某种方式轻轻地接近他们并做他们的未来的学生帮个忙,让他们知道 cbind()
会将所有论点强制转换为“最小公分母”。