【问题标题】:Issues with replacing a subset of a data.frame using the R Package dplyr使用 R 包 dplyr 替换 data.frame 子集的问题
【发布时间】:2016-03-10 12:40:10
【问题描述】:

我正在尝试替换数据集的一些过滤值。到目前为止,我写了这行代码:

df %>%
  filter(group1 == uniq[i]) %>%
  mutate(values = ifelse(sum(values) < 1, 2, NA)),

其中 uniq 只是一个包含我想要关注的变量名的列表(并且 group1 和 values 是列名)。这实际上是有效的。但是,它只输出更改后的过滤行,不会替换数据集 df 中的任何内容。有谁知道,我的错误在哪里?非常感谢!下面的代码是为了复现例子:

group1 <- c("A","A","A","B","B","C")
values <- c(0.6,0.3,0.1,0.2,0.8,0.9)
df = data.frame(group1, group2, values)
uniq <- unique(unlist(df$group1))

for (i in 1:length(uniq)){
  df <- df %>%
  filter(group1 == uniq[i]) %>%
    mutate(values = ifelse(sum(values) < 1, 2, NA))
}

我想要得到的是它保留除最后一个之外的所有值,因为它是一个唯一组 (group1 == C) 并且 0.9

【问题讨论】:

  • 如果要在原始数据集中替换 1) 您必须将输出分配回 dfdf &lt;- df %&gt;%.. 或使用 magrittr %&lt;&gt;% 运算符。 2) 我假设您只对 'group1' 中同样为 uniq[1] 的值感兴趣,需要替换。在那种情况下df &lt;- df %&gt;% mutate(values = ifelse(sum(values) &lt;1 &amp; group1==uniq[1], 2, NA))
  • 嗯...谢谢您的回复。但是,如果我使用您的第一次尝试,它会将条件应用于整个数据集,而不仅仅是 group1 == uniq[1] 的子集。第二种方法只是用 group == uniq[1] 的更改值覆盖 df(但所有其他行都消失了)。
  • 那么,我不知道你在说什么。没有可重现的示例和预期的输出,这并不容易
  • 对不起 - 你是完全正确的。我会上传一个!

标签: r package dplyr


【解决方案1】:

dplyr 不会创建新对象,除非您使用赋值运算符 (&lt;-)。

比较

require(dplyr)
data(mtcars)

mtcars %>% filter(cyl == 4)

mtcars4 <- mtcars %>% filter(cyl == 4)
mtcars4

数据相同,但在第二个示例中,过滤后的数据存储在新对象mtcars4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多