【问题标题】:R how to use fun.aggregate in dcast to keep discrete values when widening dataframe?R如何在扩展数据框时在dcast中使用fun.aggregate来保持离散值?
【发布时间】:2019-02-24 17:37:41
【问题描述】:

我一直在尝试使用 reshape2 中的 dcast() 函数来扩大 R 中的大型数据框。但是,我不确定该聚合函数 fun.aggregate 使用什么 dcast 需要,因为我想保留value.var 的离散值,而dcast 坚持强制length 作为默认值,使每个值都是二分法。为了说明,我的数据如下所示:

x <- c("a", "b", "c")
y <- c("d", "e", "f")
num <- c(10, 20, 21)
data <- data.frame(cbind(x,y,num))

x y num
a d  10
b e  20
c f  21

输入m &lt;- dcast(data, x ~ y, value.var = "num")后,dcast返回如下DF:

  d  e  f
a 1  0  0
b 0  1  0
c 0  0  1

但是,我希望它看起来像这样:

  d  e  f
a 10 0  0
b 0  20 0
c 0  0  21

我做错了什么?

【问题讨论】:

  • 对不起,这是一个错误。我的意思是让ad 的值等于 10,而不是 21。谢谢!
  • 谢谢,我忘了把元素放在引号里。我现在就改一下。
  • dcast(data, x ~ y, value.var = "num", fill = 0) 给我你想要的输出。不知道第一个结果来自哪里,如果我运行你在问题中输入的代码,我会得到你想要的输出 NAs 而不是 0s。
  • @IceCreamToucan 你是对的,它似乎适用于较小的 DF。我试图使用的数据要大得多(n = 6000),所以这一定是导致问题的原因。如果我想不出更好的解决方案,我想我会尝试将所有内容绑定在一起。

标签: r dataframe reshape reshape2


【解决方案1】:

您也可以切换到tidyr

library(tidyverse)

x <- c("a", "b", "c")
y <- c("d", "e", "f")
num <- c(10, 20, 21)

df <- tibble(x, y, num)

df %>% 
  spread(y,  num, fill = 0)

输出是:

# A tibble: 3 x 4
  x         d     e     f
  <chr> <dbl> <dbl> <dbl>
1 a        10     0     0
2 b         0    20     0
3 c         0     0    21

【讨论】:

  • 我认为这应该可行,但 num 值并不是每个观察值都是唯一的。有没有办法解决这个问题?
  • 啊,我明白了。我的一些x 值是重复的,所以我想这不起作用。
  • 也可以创建索引列。喜欢:df %&gt;% mutate(id = 1:now(df)) %&gt;% spread(y, num, fill = 0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2015-03-20
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多