当前位置: 首页 > 知识库问答 >
问题:

dplyr无法用group_by()重新定义类型

况明贤
2023-03-14

我有以下问题:

当使用 dplyr 在 group_by() 之后改变数字列时,如果一行只包含一个值,即使用 mutate 命令时的 NaN,则此值将失败。

因此,如果分组列包含数字,它将正确地分类为dbl,但只要一个组只有一个NaN实例,它就会失败,因为dplyr将该组定义为lgl,而所有其他组都是dbl。

我的第一个(也是更一般的问题)是:当使用group_by()时,有没有一种方法告诉dplyr总是以某种方式定义列?

其次,有人可以帮助我解决下面MWE中解释的问题吗:

# ERROR: This will provide the column defining error mentioned:

df <- data_frame(a = c(rep(LETTERS[1:2],4),"C"),g = c(rep(LETTERS[5:7],3)), x = c(7, 8,3, 5, 9, 2, 4, 7,8)) %>% tbl_df()
df <- df %>% group_by(a) %>% mutate_each(funs(sd(., na.rm=TRUE)),x)

df <- df %>% mutate(Winsorise = ifelse(x>2,2,x))

# NO ERROR (as no groups have single entry with NaN):
df2 <- data_frame(a = c(rep(LETTERS[1:2],4),"C"),g = c(rep(LETTERS[5:7],3)), x = c(7, 8,3, 5, 9, 2, 4, 7,8)) %>% tbl_df()
df2 <- df2 %>% group_by(a) %>% mutate_each(funs(sd(., na.rm=TRUE)),x)

# Update the Group for the row with an NA - Works
df2[9,1] <- "A"
df2 <- df2 %>% mutate(Winsorise = ifelse(x>3,3,x))


# REASON FOR ERROR: What happens for groups with one member = NaN, although we want the winsorise column to be dbl not lgl: 
df3 <- data_frame(g = "A",x = NaN)
df3 <- df3 %>% mutate(Winsorise = ifelse(x>3,3,x))

共有1个答案

华懿轩
2023-03-14

原因是,正如您在df3中正确指出的那样,当源列为NaN/NA时,突变结果被转换为逻辑。

为了避免这种情况,请将答案转换为数字:

df <- df %>% mutate(Winsorise = as.numeric(ifelse(x>2,2,x)))

也许@hadley可以解释一下为什么变异结果被视为lgl?

 类似资料:
  • 问题内容: 有没有不用典型继承就可以重新定义类或其某些方法的方法?例如: 我该怎么做才能代替?显然这是我想做的 这是我的两难选择:我更新了破坏我的代码的第三方库。我不想直接修改该库,因为将来的更新可能会再次破坏代码。我正在寻找一种无缝的方法来替换类方法。 我发现这个库说可以做到,但是我很警惕,因为它已经有4年的历史了。 编辑: 我应该澄清的是,由于框架的限制,我不能将类从重命名为to 或其他任何名

  • 无法使用ByteBuddy重新定义java.io.ObjectInputStream。 我已经尝试了很多方法来解决这个问题。但我找不到钩住“java.io.ObjectInputStream$resolveClass”的方法。你能帮助我吗?

  • 首先,请让我知道我正在做的是不是对dplyr的不当使用,因为我不确定我是否以最佳方式实现了这一点。我有以下数据帧: 我想做的过滤有点罗嗦,但我会尝试-我想通过删除col1 == '0 '的所有行来过滤数据帧,如果该行出现在该用户的第一行之后,其中col1 == '1 '。(粗体表示我把原问题搞砸了,把0和1调换了)。 例如,对于用户7,第3行的col1 == '1 ',所以我想过滤第3行之后col

  • 我对Vuejs来说是相对较新的,我已经坚持了一段时间:(页面加载时出现) 未捕获的TypeError:无法重新定义属性:$router 这个问题似乎不会影响webapp的可用性,我很确定我不会不止一次声明Vue.use(路由器)... 这是我的索引。js文件:(在src/router中) 应用程序。ts:(在src中,主要入口点) 请帮帮忙!谢谢!!

  • 我有以下数据集“df1”: 我使用“group_by”和“总结”根据“类”列的最小值对codfam进行分组 它工作正常,并返回如下结果: 现在,我将获得与函数“summarize”保留在数据集中的每个codfam相关的列“sex”的值,如下所示: 我试着用 但不幸的是,它不起作用。 任何帮助或建议将不胜感激,提前感谢!

  • 我试图在java上重新定义类。lang包,如String。类或整数。使用ByteBuddy初始化,但没有成功。我的问题是这是否可能? 这是我在我的java代理中尝试的代码: 当我检查日志的输出时,我看到的关于String类的内容是: 这是否意味着ByteBuddy没有重新定义String类?这可能吗? 非常感谢。