gpt4 book ai didi

r - 根据其他列中的最小值查找列值和名称

转载 作者:行者123 更新时间:2023-12-04 23:11:45 25 4
gpt4 key购买 nike

我有一个看起来像这样的 data.table

library( data.table )

dt <- data.table( p1 = c("a", "b", "c", "d", "e", "f", "g"),
p2 = c("b", "c", "d", "a", "f", "g", "h"),
p3 = c("z", "x", NA, NA, "y", NA, "s"),
t1 = c(1, 2, 3, NA, 5, 6, 7),
t2 = c(7, 6, 5, NA, 3, 2, NA),
t3 = c(8, 3, NA, NA, 2, NA, 1) )

# p1 p2 p3 t1 t2 t3
# 1: a b z 1 7 8
# 2: b c x 2 6 3
# 3: c d <NA> 3 5 NA
# 4: d a <NA> NA NA NA
# 5: e f y 5 3 2
# 6: f g <NA> 6 2 NA
# 7: g h s 7 NA 1

它有 p 列,表示名称,和 t 列,表示值。
t1 是对应于 p1、t2 到 p2 等的值。
在每一行上,p 列的值是唯一的(或 NA)。 t 列中的值也是如此。

我想要做的是创建三个新列:
  • t_min ,每行所有 t 列的最小值(不包括 NA)
  • p_min ,如果t_min存在(不是NA),p列对应的值...所以如果t2列有t-min值,列对应的值p2 .
  • p_col_min ,如果为 p_min,则为具有值的列的名称。因此,如果 p_min 值来自列 p2 ,然后是“p2”。

  • 我更喜欢 data.table ,因为我的实际数据包含 拍品 更多的行和列。我知道熔化是一种选择,但我想用这些数据保留我的内存,所以使用的内存越少越好(生产数据包含几百万行和 > 200 列)。

    到目前为止,我已经找到了创建 t_min 的方法。 -column 使用以下内容:
    t_cols = dt[ , .SD, .SDcols = grep( "t[1-3]", names( dt ), value = TRUE ) ]
    dt[ !all( is.na( t_cols ) ),
    t_min := do.call( pmin, c( .SD, list( na.rm = TRUE ) ) ),
    .SDcols = names( t_cols ) ]

    但我无法围绕创建 p_minp_col_min列。我想 which.min()在某处发挥作用,但我无法弄清楚。可能我忽略了一些简单的事情(它似乎总是...... ;-) )。

    所需的输出
    dt.desired <- data.table( p1 = c("a", "b", "c", "d", "e", "f", "g"), 
    p2 = c("b", "c", "d", "a", "f", "g", "h"),
    p3 = c("z", "x", NA, NA, "y", NA, "s"),
    t1 = c(1, 2, 3, NA, 5, 6, 7),
    t2 = c(7, 6, 5, NA, 3, 2, NA),
    t3 = c(8, 3, NA, NA, 2, NA, 1),
    t_min = c(1,2,3,NA,2,2,1),
    p_min = c("a","b","c",NA,"y","g","s"),
    p_col_min = c("p1","p1","p1",NA,"p3","p2","p3") )

    # p1 p2 p3 t1 t2 t3 t_min p_min p_col_min
    # 1: a b z 1 7 8 1 a p1
    # 2: b c x 2 6 3 2 b p1
    # 3: c d <NA> 3 5 NA 3 c p1
    # 4: d a <NA> NA NA NA NA <NA> <NA>
    # 5: e f y 5 3 2 2 y p3
    # 6: f g <NA> 6 2 NA 2 g p2
    # 7: g h s 7 NA 1 1 s p3

    最佳答案

    我不能保证这对于您的工作数据来说是否足够有效,但这是我首先要尝试的:

    m1 <- as.matrix(dt[, grep('^t', names(dt)), with = FALSE])
    m2 <- as.matrix(dt[, grep('^p', names(dt)), with = FALSE])

    t_min <- apply(m1, 1, min, na.rm = TRUE)
    t_min[is.infinite(t_min)] <- NA_real_
    p_min_index <- rep(NA_integer_, length(t_min))
    p_min_index[!is.na(t_min)] <- apply(m1[!is.na(t_min), ], 1, which.min)

    dt[, t_min := t_min]
    dt[, p_min := m2[cbind(seq_len(nrow(m2)), p_min_index)] ]
    dt[, p_min_col := grep('^p', names(dt), value = TRUE)[p_min_index] ]


    # p1 p2 p3 t1 t2 t3 t_min p_min p_min_col
    # 1: a b z 1 7 8 1 a p1
    # 2: b c x 2 6 3 2 b p1
    # 3: c d <NA> 3 5 NA 3 c p1
    # 4: d a <NA> NA NA NA NA <NA> <NA>
    # 5: e f y 5 3 2 2 y p3
    # 6: f g <NA> 6 2 NA 2 g p2
    # 7: g h s 7 NA 1 1 s p3

    另外,看起来您想要的输出中的第二行不正确?

    关于r - 根据其他列中的最小值查找列值和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59663612/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com