【问题标题】:Replacing 0 values with the minimum value of the row in r [closed]用r中行的最小值替换0值[关闭]
【发布时间】:2021-05-03 03:24:09
【问题描述】:

我有这样的数据original data

我想用每行的最小值(不包括0)替换0个值,我尝试了以下代码

gapFill_data <- 
  data %>% 
  mutate_all(., ~ replace(., . == 0, min(as.numeric(.[.>0]))))

它不起作用,并给我类似“In min(as.numeric(.[. > 0])) : no non-missing arguments to min;returning Inf”之类的警告。 下面是转换后的数据。 transformed data

我尝试将代码中的“min(as.numeric(.[.>0])))”替换为“5”,然后所有 0 值都替换为 5。所以我猜问题出在这里“ min(as.numeric(.[.>0])))"。任何建议表示赞赏。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请不要发布数据图片,而是使用headdput 显示一些示例数据。

标签: r replace


【解决方案1】:

mutate 用于按列操作数据。如果您想在基数 R 中按行执行此操作,一种方法是使用 apply,边距为 1。

gapFill_data <- data

gapFill_data[] <- t(apply(data, 1, function(x) 
                          replace(x, x == 0, min(x[x > 0], na.rm = TRUE))))

gapFill_data

#  a b c d
#1 1 3 1 1
#2 2 2 3 2
#3 3 4 2 2
#4 4 2 1 1
#5 5 3 4 3

数据

data <- data.frame(a = 1:5, b = c(3, 0, 4, 2, 3), c = c(0, 3, 2, 1, 4), d = 0)
data
#  a b c d
#1 1 3 0 0
#2 2 0 3 0
#3 3 4 2 0
#4 4 2 1 0
#5 5 3 4 0

【讨论】:

  • 非常感谢。它确实完美地解决了问题。 mutate 虽然适用于按列数据,但我们可以使用 rowwis() 函数将其更改为按行吗?
  • 如果您只想添加/编辑 1 列,rowwise 通常效果更好。如果您想坚持使用tidyverse,我认为更好的选择是获取长格式数据执行替换并以宽格式恢复。
  • 好吧。明白了,再次感谢。
猜你喜欢
  • 2018-06-06
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多