【问题标题】:R - Conditional ReplacementsR - 有条件的替换
【发布时间】:2021-01-20 12:30:07
【问题描述】:

我想在满足条件时替换 tibble 中的值。

Data <- tibble(a = 1:5,
b = c("a","b","a","a","a"), 
c = c("z","y","x","z","z"), 
d = c("m","n","m","m","m"),
e = c(1,3,4,7,2))

  a b c d e
1 1 a z m 1
2 2 b y n 3
3 3 a x m 4
4 4 a z m 7
5 5 a z m 2

我想根据 a 列中的最大值替换包含 b、c 和 d 列重复组合的行。这里第 1、4 和 5 行在 b、c 和 d 列中都包含“a”、“z”和“m”,所以这个例子的输出如下:

  a b c d e
1 5 a z m 2
2 2 b y n 3
3 3 a x m 4
4 5 a z m 2
5 5 a z m 2

【问题讨论】:

  • 很抱歉,不确定那里发生了什么,看来我需要在 Stack Overflow 上一些课程。现在应该有意义了。
  • 查看我的答案编辑,我认为这是您现在需要的。
  • r2evans 你绝对的英雄!你已经解决了我几个月来一直在工作的一个问题,非常感谢你!!!
  • 慢慢来,但由于这是您的第一个问题……习惯(甚至是“礼仪”)通过选择首选答案和accepting it 来结束问题;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的人进行投票。再说一次,不要着急,确保它是你需要的……但请不要忘记回来接受其中一个。谢谢!

标签: r replace duplicates conditional-statements tibble


【解决方案1】:

这里有一个想法,针对修改后的要求进行了更新,即ea 最大的行更新为e 的值。

tidyverse

library(dplyr)
Data %>%
  group_by(b,c,d) %>%
  mutate(e = e[which.max(a)], a = max(a)) %>% 
  ungroup()
# # A tibble: 5 x 5
#       a b     c     d         e
#   <int> <chr> <chr> <chr> <dbl>
# 1     5 a     z     m         2
# 2     2 b     y     n         3
# 3     3 a     x     m         4
# 4     5 a     z     m         2
# 5     5 a     z     m         2

计算ea 的顺序当然很关键:如果你先max(a),那么e 将不知道a 是哪个原始值是最大值。

数据表

library(data.table)
cols <- c("a", "e")
as.data.table(Data)[, c("e", "a") := .(e[which.max(a)], max(a)), by = .(b, c, d)][]
#    a b c d e
# 1: 5 a z m 2
# 2: 2 b y n 3
# 3: 3 a x m 4
# 4: 5 a z m 2
# 5: 5 a z m 2

(后面的[] 只是data.table 中的一个小功能/错误......它只是为了美观,没有它的数据是一样的。)

【讨论】:

  • 谢谢,tidyverse 解决方案有效,但是 E 列不是最大值而是字符的情况呢?
  • (1) 从技术上讲,max(LETTERS) 仍然有效,因此不会出错。 (2)我真的不知道,我不知道数据,你从来没有暗示过这种可能性。听起来您的样本数据并不能真正代表您的实际数据?
  • 是的,这是我第一次在 StackOverflow 上提交,所以不确定我需要包括什么:) 我的问题是第 5 行实际上是 5 azm 5,所以我希望第 1 行和第 4 行反映假设第 5 行在 a 列中具有最大值。再次抱歉,如果不清楚,这是我的第一次
  • 我不明白我建议的代码如何不起作用,即使进行了更改。我建议您编辑您的问题以将数据更新为 that,并确保也更新您的预期输出。谢谢!
  • 感谢您的建议 :) 希望编辑能让它更清晰 :)
【解决方案2】:

base R中,我们可以使用ave

Data$a <- with(Data, ave(a, b, c, d, FUN = max))
Data$e <- with(Data, ave(e, b, c, d, FUN = max))

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 2016-12-15
    • 1970-01-01
    • 2012-07-07
    • 2020-10-01
    • 2020-02-10
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多