如何用R从数据框中的各个列中找出最小值?

如何用R从数据框中的各个列中找出最小值?,r,dataframe,min,R,Dataframe,Min,我的数据框是: `Account id Fcast 1 Fcast 2 Fcast 3 Diff 1 Diff 2 Diff 3 101 4000 2000 1000 1000 3000 4000 201 2900 3300 5000 100 300 2000 301 -100 5500 -800 1700 7300 1000

我的数据框是:

`Account id Fcast 1 Fcast 2 Fcast 3 Diff 1  Diff 2  Diff 3  
  101          4000  2000   1000    1000    3000    4000    
  201          2900  3300   5000    100     300     2000    
  301          -100  5500   -800    1700    7300    1000    
  401          5000  8000   7100    2500    500     400     
  501          9000  12000  2000    15000   12000   22000   
所需的结果是从标记为Diff的列中找出最小值

`Account id  Min
  101        1000
  201         100
  301        1000
  401         400
  501       12000

理想情况下,我还需要获取另一列,该列由获取最小值的列名填充。

我们可以在行模式下使用
apply

data.frame(AccountId=df$AccountId,
           Min=apply(df[names(df)[grepl("^Diff\\d", names(df))]], 1, FUN=min))

  AccountId   Min
1       101  1000
2       201   100
3       301  1000
4       401   400
5       501 12000
数据:

df <- data.frame(AccountId=c(101, 201, 301, 401, 501),
                 Fcast1=c(4000, 2900, -100, 5000, 9000),
                 Fcast2=c(2000, 3300, 5500, 8000, 12000),
                 Fcast3=c(1000, 5000, -800, 7100, 2000),
                 Diff1=c(1000, 100, 1700, 2500, 15000),
                 Diff2=c(3000, 300, 7300, 500, 12000),
                 Diff3=c(4000, 2000, 1000, 400, 22000))

df我们可以在行模式下使用
apply

data.frame(AccountId=df$AccountId,
           Min=apply(df[names(df)[grepl("^Diff\\d", names(df))]], 1, FUN=min))

  AccountId   Min
1       101  1000
2       201   100
3       301  1000
4       401   400
5       501 12000
数据:

df <- data.frame(AccountId=c(101, 201, 301, 401, 501),
                 Fcast1=c(4000, 2900, -100, 5000, 9000),
                 Fcast2=c(2000, 3300, 5500, 8000, 12000),
                 Fcast3=c(1000, 5000, -800, 7100, 2000),
                 Diff1=c(1000, 100, 1700, 2500, 15000),
                 Diff2=c(3000, 300, 7300, 500, 12000),
                 Diff3=c(4000, 2000, 1000, 400, 22000))

df使用
dplyr

library(dplyr)
cols <- grep('Diff', names(df), value = TRUE)

df %>%
  group_by(Accountid) %>%
  mutate(Min = min(c_across(cols)),
         Min_name = cols[which.min(c_across(cols))]) %>%
  select(Accountid, Min, Min_name)

#  Accountid   Min Min_name
#      <int> <int> <chr>   
#1       101  1000 Diff1   
#2       201   100 Diff1   
#3       301  1000 Diff3   
#4       401   400 Diff3   
#5       501 12000 Diff2   
库(dplyr)
科尔斯%
分组人(帐户ID)%>%
突变(Min=Min(c_穿过(cols)),
Min_name=cols[哪个.Min(c_横跨(cols)))%>%
选择(帐户ID、最小值、最小值名称)
#Accountid最小值\u名称
#           
#1011000diff1
#2 201 100 Diff1
#3 301 1000 Diff3
#4 401 400 Diff3
#50112000差2
数据

df <- structure(list(Accountid = c(101L, 201L, 301L, 401L, 501L), 
Fcast1 = c(4000L, 2900L, -100L, 5000L, 9000L), Fcast2 = c(2000L, 3300L, 5500L, 
8000L, 12000L), Fcast3 = c(1000L, 5000L, -800L, 7100L, 2000L), 
    Diff1 = c(1000L, 100L, 1700L, 2500L, 15000L), Diff2 = c(3000L, 
    300L, 7300L, 500L, 12000L), Diff3 = c(4000L, 2000L, 1000L, 
    400L, 22000L)), class = "data.frame", row.names = c(NA, -5L))

df使用
dplyr

library(dplyr)
cols <- grep('Diff', names(df), value = TRUE)

df %>%
  group_by(Accountid) %>%
  mutate(Min = min(c_across(cols)),
         Min_name = cols[which.min(c_across(cols))]) %>%
  select(Accountid, Min, Min_name)

#  Accountid   Min Min_name
#      <int> <int> <chr>   
#1       101  1000 Diff1   
#2       201   100 Diff1   
#3       301  1000 Diff3   
#4       401   400 Diff3   
#5       501 12000 Diff2   
库(dplyr)
科尔斯%
分组人(帐户ID)%>%
突变(Min=Min(c_穿过(cols)),
Min_name=cols[哪个.Min(c_横跨(cols)))%>%
选择(帐户ID、最小值、最小值名称)
#Accountid最小值\u名称
#           
#1011000diff1
#2 201 100 Diff1
#3 301 1000 Diff3
#4 401 400 Diff3
#50112000差2
数据

df <- structure(list(Accountid = c(101L, 201L, 301L, 401L, 501L), 
Fcast1 = c(4000L, 2900L, -100L, 5000L, 9000L), Fcast2 = c(2000L, 3300L, 5500L, 
8000L, 12000L), Fcast3 = c(1000L, 5000L, -800L, 7100L, 2000L), 
    Diff1 = c(1000L, 100L, 1700L, 2500L, 15000L), Diff2 = c(3000L, 
    300L, 7300L, 500L, 12000L), Diff3 = c(4000L, 2000L, 1000L, 
    400L, 22000L)), class = "data.frame", row.names = c(NA, -5L))

df使用data.table的解决方案

dt[,`:=`(min_val=apply(.SD,1,min),
         min_col=names(.SD)[apply(.SD,1,which.min)]),.SDcols=names(dt) %like% 'diff']
  • 在这里,
    .SDcols
    选择要处理的列子集,在本例中,选择包含工作
    diff
    的列。因此,像
  • .SD
    现在表现为一个子集data.table,只有
    diff

    • 使用data.table的解决方案

      dt[,`:=`(min_val=apply(.SD,1,min),
               min_col=names(.SD)[apply(.SD,1,which.min)]),.SDcols=names(dt) %like% 'diff']
      
      • 在这里,
        .SDcols
        选择要处理的列子集,在本例中,选择包含工作
        diff
        的列。因此,像
  • .SD
    现在表现为一个子集data.table,只有
    diff

  • 另一个选项是使用
    apply
    功能:

    df <- data.frame(df$AccountId, min = apply(df[, 2:ncol(df)], 1, min))
    

    df另一个选项是使用
    apply
    功能:

    df <- data.frame(df$AccountId, min = apply(df[, 2:ncol(df)], 1, min))
    

    df如果希望在应答数据帧中使用Fcast1而不是Diff1,该怎么办。在这种情况下,您可以创建一个新的向量
    cols1,它还告诉我-[无法找到函数“c_cross”]
    c_cross
    dplyr
    1.0.0或更高版本中提供。您可能需要更新您的
    dplyr
    package.c_以解决问题,但现在的错误是“找不到函数”%>%”。如果您希望在应答数据框中使用Fcast1而不是Diff1,该怎么办。在这种情况下,您可以创建一个新的向量
    cols1,它还告诉我-[找不到函数“c_over”]
    dplyr
    1.0.0或更高版本中提供了跨
    c_
    。您可能需要更新
    dplyr
    package.c_以解决问题,但现在的错误是“找不到函数”%>%