【问题标题】:Insert specified values in R grouped df and fill up missing values using another df (R)在 R 分组 df 中插入指定值并使用另一个 df (R) 填充缺失值
【发布时间】:2020-01-09 16:25:37
【问题描述】:

我有 2 个 dfs:df & xdf

df <- tibble(id = c("a", "a", "a", "a", "b", "b", "b", "b"),
             x = c(1, 2, 3, 4, 1, 2, 3, 4),
             y = c(0.2, 0, 0.9, 7, 1, 0.3, 5, 5.1))

xdf <- tibble(id = c("a", "b"),
              x = c(2, 3.5))

df 中,在“id”列中,对于组 (a 和 b),我只想插入与相同 id 匹配的 xdf 行名称与 df 相同。我怎样才能做到?我尝试了以下命令,但 xdf$x 的所有值都为每个组插入。

ndf <- df %>%
  group_by(id) %>% 
  do(add_row(., id = .$id[1], x = xdf$x))

> ndf
# A tibble: 12 x 3
# Groups:   id [2]
   id        x     y
   <chr> <dbl> <dbl>
 1 a       1     0.2
 2 a       2     0  
 3 a       3     0.9
 4 a       4     7  
 5 a       2    NA  
 6 a       3.5  NA  
 7 b       1     1  
 8 b       2     0.3
 9 b       3     5  
10 b       4     5.1
11 b       2    NA  
12 b       3.5  NA

# expected result should be : ndf <- ndf[c(-6,-11),]

我的最终目标是用 approx() 函数填充这些 ndf 的新生儿NA。但是我的问题仍然存在,因为我使用的是调用多余值的 xout = xdf$x 。我该如何克服呢?你能帮忙写一个使 xout 变化的函数吗?

f <- function(z) 
{
  fdf <- approx(z$x, z$y, xout = xdf$x, method = "linear")
  return(data.frame(nx= fdf$x, y.out = fdf$y, id = unique(z$id)))
}

jdf <- as.data.frame(ddply(ndf, .(id),  f))
zdf <- subset(jdf, select = c(id, nx, y.out))

> zdf
  id  nx y.out
1  a 2.0  0.00
2  a 3.5  3.95
3  b 2.0  0.30
4  b 3.5  5.05

# expected results
  id  nx y.out
1  a 2.0  0.00
2  b 3.5  5.05

欢迎任何有用的提示。非常感谢!

【问题讨论】:

  • 您在寻找bind_rows(df, xdf)吗?至少在你的情况下,这会产生你想要的输出。
  • bind_rows(df, xdf) 不是我想要的,因为dim(zdf) 仍然是 4*3。我想要 zdf 中的一个输出值,ndf 中的一个输入值。还是谢谢。
  • 您能否添加一个示例,其中所需的输出与使用 bind_rows 不同?
  • ndf &lt;- df %&gt;% group_by(id) %&gt;% do(add_row(., id = .$id[1], x = xdf$x))dim(ndf) 12*3。 bind_rows(df, xdf) 给出一个昏暗 10*3 的小标题。实际上,我想要的是 10*3 的dim(ndf)。你的回答是对的。但我最终得到的zdf 太大了。我想要一个唯一值 y.out 用于唯一输入值 a &lt;- 2b &lt;- 3.5。我知道,这并不像听起来那么容易。谢谢。
  • 这个独特的y.out是如何定义的?

标签: r function dataframe dplyr interpolation


【解决方案1】:
library(dplyr)

df <- tibble(id = c("a", "a", "a", "a", "b", "b", "b", "b"),
             x = c(1, 2, 3, 4, 1, 2, 3, 4),
             y = c(0.2, 0, 0.9, 7, 1, 0.3, 5, 5.1))

xdf <- tibble(id = c("a", "b"),
              x = c(2, 3.5))

ndf <- df %>%
  bind_rows(xdf) %>% 
  arrange(id)

zdf <- ndf %>%
  group_by(id) %>%
    group_modify(~mutate(., y_approx = approx(.$x, .$y, .$x, method = "linear")[["y"]])) %>%
    ungroup() %>%
  filter(is.na(y)) %>%
  select(id, y_approx)

【讨论】:

  • 此示例针对xdf 中的每一行向ndf 广告一行。如果这不正确,您希望ndf 的尺寸与ndfxdf 的尺寸相同吗?
  • dim(df) # 8*3 dim(xdf) # 2*2 dim(ndf) # 10*3 这是对的,我同意,问题更进一步。我仍然以 4*3 的 dim(zdf) 结束。我更喜欢dim(zdf) 正好等于 2*2。 (我的真实数据比这个例子大得多,所以我最终在zdf 中有太多不需要的值)。谢谢。
  • 抱歉造成误会。我现在使用approx() 添加了插值。
  • 这个建议并不完全正确,但它是我正在寻找的答案的一个良好开端......看起来你的 y_approx 直接在整个向量 ndf$y 内插值......不管现有因素如何 ab :为什么我们的 y.out(s) 实际上是错误的。ay.out 应该等于 0.by.out 应该相等到5.05(使用正确的线性插值)。 ndf &lt;- as.data.frame(ndf)ndf$id &lt;- as.factor(ndf$id) str(ndf) 在您的代码导致相同的错误 y.out 值之前。谢谢。
  • 我发现了一个简洁的函数group_modify(),它允许我们在保持 dplyr 语法的同时通过 id 应用插值函数。
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 2020-12-29
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2022-01-08
  • 2012-10-12
相关资源
最近更新 更多