【问题标题】:Normalize specified columns in dplyr by value in first row按第一行中的值规范化 dplyr 中的指定列
【发布时间】:2019-06-17 03:53:43
【问题描述】:

我有一个包含四行、23 个数字列和一个文本列的数据框。我正在尝试通过减去第一行中的值来标准化所有数字列。

我已经尝试让它与 mutate_at 一起工作,但我找不到让它工作的好方法。

我通过转换为矩阵并转换回小标题来使其工作:

## First, did some preprocessing to get out the group I want
totalNKFoldChange <- filter(signalingFrame,
                            Population == "Total NK") %>% ungroup

totalNKFoldChange_mat <- select(totalNKFoldChange, signalingCols) %>%
    as.matrix()

normedNKFoldChange <- sweep(totalNKFoldChange_mat,
                            2, totalNKFoldChange_mat[1,])

normedNKFoldChange %<>% cbind(Timepoint = 
                              levels(totalNKFoldChange$Timepoint)) %>% 
    as.tibble %>%
    mutate(Timepoint = factor(Timepoint,
                              levels = levels(totalNKFoldChange$Timepoint)))

我很确定有一个更好的方法可以完全是 dplyr 原生的。有人有提示吗?谢谢!!

【问题讨论】:

  • 请使用dput()添加您的数据。
  • 不幸的是,这些数据是专有的。我会上传一个玩具数据集,但谢天谢地,有人能够在没有数据集的情况下提供有用的回复。干杯。

标签: r dplyr


【解决方案1】:

如果我们想normalize all the numeric columns by subtracting the value in the first row,请使用mutate_if

library(dplyr)
df1 %>%
     mutate_if(is.numeric, list(~ .- first(.)))

【讨论】:

  • 非常感谢!!你能解释一下为什么第二个参数是一个带有公式的单个条目列表吗?我仍然无法理解 dplyr 语法
  • @Geoff 以前,语法是funs(. - first(.)),但现在funs 已被弃用,它是list(。这里. 指的是列值,first(.) 是该列的第一个值。基本上减去第一个值的列进行标准化
  • 啊,我明白了!我曾尝试过.-first(.),但遇到了一个我无法解释的错误,没有意识到我可以通过将其列为列表来修复它哈哈
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 2021-10-11
  • 2021-02-16
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多