【问题标题】:Return name of column containing max value, from only certain selected columns in a data.frame仅从 data.frame 中的某些选定列返回包含最大值的列的名称
【发布时间】:2015-09-10 14:00:06
【问题描述】:

我想(在 data.table 的新列中)获取包含 data.frame 中仅几列中最大值的列的列名。

这是一个示例 data.frame

# creating the vectors then the data frame ------
id = c("a", "b", "c", "d")
 ignore = c(1000,1000, 1000, 1000) 
 s1 = c(0,0,0,100)
s2 = c(100,0,0,0)
s3 = c(0,0,50,0)
s4 = c(50,0,50,0)
 df1 <- data.frame(id,ignore,s1,s2,s3,s4)  

(1) 现在我想从 s1-s4 列中找到每行中最大数量的列名。 (即忽略名为“ignore”的列)

(2) 如果最大值相同,我希望返回最后一个(例如 s4)列名。

(3) 作为一个额外的帮助 - 如果全部为 0,我希望 NA 返回

这是我迄今为止最好的尝试

df2 <- cbind(df1,do.call(rbind,apply(df1,1,function(x) {data.frame(max.col.name=names(df1)[which.max(x)],stringsAsFactors=FALSE)})))

这在每种情况下都会返回忽略,并且(b 行除外)如果我删除此列并将 s1-s4 列重新排序为 s4-s1 则有效。

你会如何处理这个问题?

非常感谢。

【问题讨论】:

  • 我同意这不是完全重复的,除了第 (1) 点。

标签: r dataframe


【解决方案1】:

我们使用grep 为以“s”开头后跟数字(“i1”)的列创建列索引。要获取具有最大值的子集数据集 ('df1[i1]') 的行索引,我们可以使用 max.col 和选项 ties.method='last'。要将只有 0 值的行转换为 NA,我们得到 rowSums,检查它是否为 0 (==0) 并将它们转换为 NA (NA^) 并乘以 max.col 输出。这可用于提取子集数据集的列名。

i1 <- grep('^s\\d+', names(df1))
names(df1)[i1][max.col(df1[i1], 'last')*NA^(rowSums(df1[i1])==0)]
#[1] "s2" NA   "s4" "s1"

【讨论】:

  • 谢谢阿克伦。 - 如果我的理解是正确的,第一行定义要考虑的列列表,第二行执行查询。太好了,再次感谢。
  • 再次感谢 - 如果某些 S1-S4 列中有 NA,您将如何修改它?我已经尝试使用 na.omit 在它之前或在它之后使用 na.rm = TRUE 但无法让它工作。有任何想法吗?非常感谢
  • @threeisles 我猜您将NA 替换为0,然后尝试。即df1[is.na(df1)] &lt;- 0(未测试)
  • 谢谢我试过这个:df[i1][is.na(df1[i1])]
【解决方案2】:
library(dplyr)
library(tidyr)

df1 = data_frame(
  id = c("a", "b", "c", "d")
  ignore = c(1000,1000, 1000, 1000) 
  s1 = c(0,0,0,100)
  s2 = c(100,0,0,0)
  s3 = c(0,0,50,0)
  s4 = c(50,0,50,0))

result = 
  df1 %>%
  gather(variable, value, -id, -ignore) %>%
  group_by(id) %>%
  slice(value %>%
          {. == max(.)} %>%
          which %>%
          last) %>%
  ungroup %>%
  mutate(variable_fix = ifelse(value == 0,
                               NA,
                               variable))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多