【问题标题】:R - Shift specified columns using minimum value into positive valuesR - 使用最小值将指定的列转换为正值
【发布时间】:2021-02-03 14:53:03
【问题描述】:

我正在寻找一种简单的方法来为我的数据框中的每一列添加最小值。

这感觉很常见,但我还没有找到任何好的答案……也许我遗漏了一些明显的东西。

假设我有两列(实际上我有接近 100 列),其中包含正数和负数。

w <- c(9, 9, 9, 9)
x <- c(-2, 0, 1, 3)
y <- c(-1, 1, 3, 4)

z <- as.data.frame(cbind(w, x, y))

  w  x  y
1 9 -2 -1
2 9  0  1
3 9  1  3
4 9  3  4

我希望 z 在仅对 x 和 y 列 [,2:3] 进行转换后看起来像这样

  w  x  y
1 9  0  0
2 9  2  2
3 9  3  4
4 9  5  5

这有意义吗?

【问题讨论】:

    标签: r


    【解决方案1】:
    library(dplyr)
    
    dplyr::mutate(z, across(c(x, y), ~ . + abs(min(.))))
    
      w x y
    1 9 0 0
    2 9 2 2
    3 9 3 4
    4 9 5 5
    

    对于非连续的列位置,您也可以通过将c(x,y) 更改为2:3c(2:3, 5) 来按列位置而不是列名称。

    【讨论】:

    • 如何声明特定列?我更新了上面的示例。
    • 然后我会使用dplyr 包中的mutateacross。我已经更新了我的答案。
    • Hrm,我真的很喜欢 tidyr 方法和这种格式,但我将所有声明的字段都显示为 NA
    • adstrat &lt;- mutate(adstrat, across(c(33:137), ~ . + abs(min(.)))) 是我对该 sn-p 的应用(我的 df 称为 adstrat33:137 是感兴趣的列)
    • 您的专栏中有NA 吗?如果是这样,请更改为min(., na.rm = T)
    【解决方案2】:

    完全取决于您的意思以及如果没有负值,您希望发生什么。无论值如何,这都会将最小值固定为 0,但如果您想要稍微不同的值,您应该能够对其进行调整。

    z[] = lapply(z, function(col) col - min(col))
    z
    #   x y
    # 1 0 0
    # 2 2 2
    # 3 3 4
    # 4 5 5
    

    附带说明,as.data.frame(cbind(x, y)) 不好 - 如果您混合了数字和字符值,cbind() 会将所有内容转换为字符。简化为data.frame(x, y)更短更好。

    【讨论】:

    • 我想我明白你在那里尝试做什么,但我如何为特定列声明这一点? (是的,cbind 只是我生成示例的速记。)
    • 如果你有一个列向量,你想应用它,比如my_cols = c("col1", "col3", "col4") - 也可以是一个逻辑向量,那么你可以指定这些列:z[my_cols] = lapply(z[my_cols], ...)
    • 是的,我知道cbind 对这个问题并不重要,这只是我经常看到的一个坏习惯,当我看到它时我会尝试指出它以帮助人们更好地形成习惯。
    • my_col &lt;- c(33:137) adstrat[my_col] &lt;- lapply(adstrat, function(my_col) my_col - min(my_col)) 不适合我。
    • 当您将adstrat 传递给lapply 时,您需要对其进行子集化:my_col &lt;- c(33:137); adstrat[my_col] &lt;- lapply(adstrat[my_col], function(col) col - min(col))。为函数参数和要转换的列向量使用不同的名称,以减少混乱。
    【解决方案3】:

    你要吗

    z[] <- lapply(z, function(columnValues) columnValues + abs(min(columnValues)))
    

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 2016-08-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2015-07-02
      相关资源
      最近更新 更多