【问题标题】:Getting maximum value and name for column, and conditioning other columns on it in R获取列的最大值和名称,并在 R 中调整其他列
【发布时间】:2021-12-04 14:57:19
【问题描述】:

我有一个大约 15 列的数据框。 A_1 A_2 B_1 B_2 C_1 C_2 ... 我正在尝试比较 A 列和 B 列,在比较 A 和 B 的列中获取最大值,以及具有最高值的列的名称,然后使用它来获取值和名称从其他列。但是,如果 A_1 和 A_2 相等,我希望它改为比较 B_1 和 B_2 并选择最高值,并基于从 C_1/C_2 D_1/D_2 等中选择的值。所以程序上:

  1. 获取 A_1 与 A_2 的最大值
  2. 获取 A_1 与 A_2 的最大列的名称
  3. 如果 A_2 是最大值,则获取 B_2、C_2 等的名称和值
  4. 如果 A_1 = A_2,则改为比较 B_1 和 B_2,然后获取 C_1/C_2 等的名称和值。

我已经到了代码中的第 3 步,但如果没有这个给出预期输出的非常丑陋的解决方案,我似乎无法弄清楚如何跳转到第 4 步。复制下面的例子:

dat <- read.table(text = "ID    A_1   A_2    B_1   B_2
 11      1       2       3       4
 32      5       6       7       8
 73      15       12       10       11
 84      13       13       15       16
 65      2       1       2       5
                  ", header = TRUE)



j1 <- max.col(dat[c("A_1","A_2")], "first")
dat$max_A_name <- names(dat[c("A_1","A_2")])[j1]

k1 <- max.col(dat[c("B_1","B_2")], "first")
dat$max_B_name <- names(dat[c("B_1","B_2")])[k1]


dat <- dat %>% 
  mutate(max_A_val=ifelse(max_A_name=="A_1",A_1,A_2)) %>%
  mutate(B_name=ifelse(max_A_name=="A_1","B_1","B_2")) %>% 
  mutate(B_val=ifelse(max_A_name=="A_1",B_1,B_2)) %>% 
  mutate(B_name=ifelse(A_1==A_2,max_B_name,B_name)) %>% 
  mutate(max_B_val=ifelse(max_B_name=="B_1",B_1,B_2)) %>% 
  mutate(B_val=ifelse(A_1==A_2,max_B_val,B_val))
dat

【问题讨论】:

  • 试图解决它,非常丑陋的解决方案......但是给出了这个预期的输出,我将它添加到顶部

标签: r


【解决方案1】:

我认为使用 dplyr 不适合这个。如果我理解你的问题,这是我的版本。我添加了 C_1 和 C_2 列。由于 A_1 的最大值 > A_2 的最大值,那么您应该选择 B_1 和 C_1,这是下面代码的输出。

dat <- read.table(text = "ID    A_1   A_2    B_1   B_2  C_1 C_2
 11      1       2       3       4  3 15
 32      5       6       7       8  5 1
 73      15       12       10       11  14  12
 84      13       13       15       16  12  21
 65      2       1       2       5  14  24
                  ", header = TRUE)

# order your non ID columns alphabetically
dat <- dat[,c(1, order(colnames(dat)[2: ncol(dat)]) + 1)]

# loop through each pair and assess max; if a max is found, break.
maxIndex <- NA
for (i in seq(2, ncol(dat), 2)) {
  colNameOne <- colnames(dat)[i]
  colNameTwo <- colnames(dat)[i + 1]
  
  colValuesOne <- dat[, i]
  colValuesTwo <- dat[, i + 1]
  
  if (max(colValuesOne) > max(colValuesTwo)) {
    maxIndex <- i
    break
    
  } else if (max(colValuesTwo) > max(colValuesOne)) {
    maxIndex <- i + 1
    break
  }
}

# if there was a max found, display the next columns.
if (!is.na(maxIndex)) {
  datInterested <- dat[, seq(maxIndex + 2, ncol(dat), 2)]
}

datInterested

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2019-09-26
    相关资源
    最近更新 更多