gpt4 book ai didi

R:使用多列中的条件删除行并替换值

转载 作者:行者123 更新时间:2023-12-01 07:11:40 36 4
gpt4 key购买 nike

我想过滤掉 var3 < 5 的所有值,同时保留每个 var1 值至少出现一次。

> foo <- data.frame(var1=c(1, 1, 8, 8, 5, 5, 5), var2=c(1,2,3,2,4,6,8), var3=c(7,1,1,1,1,1,6))
> foo
var1 var2 var3
1 1 1 7
2 1 2 1
3 8 3 1
4 8 2 1
5 5 4 1
6 5 6 1
7 5 8 6
subset(foo, (foo$var3>=5))将删除第 2 行到第 6 行,我会丢失 var1==8。
  • 如果 var1 的另一个值满足条件 foo$var3 >= 5,我想删除该行。请参阅第 5 行。
  • 我想保留该行,如果所有出现的值 var1 不满足条件 foo$var3 >= 5,则将 NA 分配给 var2 和 var3。

  • 这是我期望的结果:
      var1 var2 var3
    1 1 1 7
    3 8 NA NA
    7 5 8 6

    这是我得到的最接近的:
    > foo$var3[ foo$var3 < 5 ] = NA
    > foo$var2[ is.na(foo$var3) ] = NA
    > foo
    var1 var2 var3
    1 1 1 7
    2 1 NA NA
    3 8 NA NA
    4 8 NA NA
    5 5 NA NA
    6 5 NA NA
    7 5 8 6

    现在我只需要知道如何有条件地删除正确的行(2、3 或 4、5、6):如果 var2 和 var3 为 NA 并且 var1 的值出现超过 1 次,则删除该行。

    但是肯定有一种更简单/优雅的方法来解决这个小问题。

    编辑:已更改 foo更像我的用例

    最佳答案

    最快的方法是使用合并:

    > merge(foo[foo$var3>5,],unique(foo$var1),by.x=1,by.y=1,all.y=T)
    var1 var2 var3
    1 1 1 7
    2 5 8 6
    3 8 NA NA
    unique(foo$var1)给出 var1 中的唯一值。这些映射到 var3 大于 5 的数据帧。你取每个参数的第一列 (all.x=1, all.y=1) 并且你说 y 中的所有值都应该被表示 (all.y=T)。另见 ?merge .

    如果要保留顺序,则:
    > merge(foo[foo$var3>5,],unique(foo$var1),by.x=1,by.y=1,
    + all.y=T)[order(unique(foo$var1)),]
    var1 var2 var3
    1 1 1 7
    3 8 NA NA
    2 5 8 6

    merge 对发生映射的变量进行排序。 order给出这种排序,因此您可以使用该顺序作为索引来反转它。另见 ?order .

    关于R:使用多列中的条件删除行并替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702045/

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