【问题标题】:obtain corresponding value of one column based on minimum value of another in R根据R中另一列的最小值获得一列的对应值
【发布时间】:2021-01-20 11:31:09
【问题描述】:

我有几对变量,例如X1 和 Y1、X2 和 Y2...Xn 和 Yn 等)。我知道要获得某些列的最小值,例如(X1,X2...Xn),但我想找到对应于最小 X 值的 Y 值。我在想可能是某种键/值对......会做到这一点,但不能完全弄清楚如何实现它。如果有人可以提供任何形式的解决方案,那就太好了。

# Make some dummy data
X1 = c(1,20,3,40,5)
Y1 = c(20,32,60,82,100)
X2 = c(10,2,30,4,50)
Y2= c(2,30,6,80,10)
df = data.frame(X1,Y1,X2,Y2)

 # This is what the dataframe looks like 
  X1  Y1 X2 Y2
1  1  20 10  2
2 20  32  2 30
3  3  60 30  6
4 40  82  4 80
5  5 100 50 10

# create column of minimum X values
df$minX = c(pmin( df[,1], df[,3]))

我想创建另一列,其 Y 值对应于 X 的最小值,但不知道该怎么做。在上面的示例中,生成的数据框应如下所示。 注意:对应的 Y 值不一定是最大值或最小值)。

  X1  Y1 X2 Y2 minX correspondingY
1  1  20 10  2    1             20
2 20  32  2 30    2             30
3  3  60 30  6    3             60
4 40  82  4 80    4             80
5  5 100 50 10    5            100

任何帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    也许你可以试试下面的代码

    X <- df[startsWith(names(df), "X")]
    df$minX <- do.call(pmin, X)
    df$correspondingY <- df[startsWith(names(df), "Y")][cbind(seq(nrow(X)), max.col(-X))]
    

    给了

    > df
      X1  Y1 X2 Y2 minX correspondingY
    1  1  20 10  2    1             20
    2 20  32  2 30    2             30
    3  3  60 30  6    3             60
    4 40  82  4 80    4             80
    5  5 100 50 10    5            100
    

    【讨论】:

      【解决方案2】:

      tidyverse 你可以这样做:

      library(dplyr)
      
      df1 <- df %>% mutate(row = row_number()) 
      
      df1 %>%
        inner_join(
      df1 %>%
        tidyr::pivot_longer(cols = -row,
                     names_to = c('.value'), 
                     names_pattern = '([A-Z])') %>%
        group_by(row) %>%
        slice(which.min(X)),  by = 'row')
      
      #  X1  Y1 X2 Y2 row X   Y
      #1  1  20 10  2   1 1  20
      #2 20  32  2 30   2 2  30
      #3  3  60 30  6   3 3  60
      #4 40  82  4 80   4 4  80
      #5  5 100 50 10   5 5 100
      

      如果不需要,您可以删除row 列。

      【讨论】:

        猜你喜欢
        • 2014-10-05
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多