【问题标题】:How to assign unambiguous values for each row in a data frame based on values found in rows from another data frame using R?如何根据使用 R 在另一个数据框的行中找到的值为数据框中的每一行分配明确的值?
【发布时间】:2022-01-16 01:39:43
【问题描述】:

这几天我一直在纠结这个问题。 我需要扫描数据框中的每一行,然后根据在第二个数据框中找到的值为每一行分配一个唯一的标识符。这是一个玩具示例。

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))

有什么提示吗?

【问题讨论】:

    标签: r dataframe matching


    【解决方案1】:

    这是一个使用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() 会将所有论点强制转换为“最小公分母”。

    【讨论】:

      【解决方案2】:

      您可以使用tidyverse 方法:

      library(dplyr)
      library(tidyr)
      
      df1 %>% 
        left_join(df2 %>% 
                    pivot_longer(-row_number) %>% 
                    select(-name),
                  by = c("Building" = "value"))
      

      返回

        Building row_number
      1 99443975          4
      2      558          1
      3 99009680          2
      4 99044573          3
      5      599          3
      6 99172478          2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-12
        • 2016-11-01
        • 2020-11-13
        • 2021-11-22
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多