【问题标题】:R: replacing values in the randomly selected fractions of observationsR:替换随机选择的观察分数中的值
【发布时间】:2018-06-21 09:12:02
【问题描述】:

我对 R 比较陌生,可能这个问题的解决方案相当简单。

让我们想象一下,我有两个鸟类(a 和 b)的巢数据集,如下所示:

df
year nestid sp  egg chick
2013    a1  a   2   1
2013    a2  a   NA  1
2013    a3  a   NA  0
2013    a4  a   NA  1
2013    a5  a   NA  0
2013    b1  b   2   0
2013    b2  b   NA  1
2013    b3  b   NA  2
2013    b4  b   NA  1
2014    a1  a   NA  1
2014    a2  a   NA  1
2014    a3  a   1   1
2014    a4  a   NA  1
2014    a5  a   NA  1
2014    b1  b   NA  1
2014    b2  b   NA  2
2014    b3  b   NA  2
2014    b4  b   NA  1

我想从小鸡的数量推断那些“NA”的鸡蛋数量。如果有“2”只小鸡,因为它们最多产下 2 个鸡蛋,则将“NA”替换为 2 是有意义的。

但是我想在 2013 年用“2”替换随机选择的 80% 的带有 1 只小鸡的巢的 NA,并用“1”替换剩余的 20% 的巢和 1 只小鸡的 2013 年物种“a”。但这2014 年物种“a”的离合器尺寸为 2 和 1 的比率分别为 40% 和 60%。

我试过这样,但无法弄清楚如何正确编码。

df%>% mutate(egg=ifelse(egg==0 & chick==2, 2, egg))

df%>% 
mutate(egg=ifelse(egg==0 & chick==1 & year==2013, sample_frac(.8)==2, egg))

任何帮助将不胜感激!

非常感谢

【问题讨论】:

  • dput你的数据并粘贴dput(df),这样别人就可以使用你的数据了

标签: r random dplyr


【解决方案1】:

其中一种方法可能是

set.seed(123)

#missing egg & chick = 2
df$egg <- with(df,ifelse(is.na(egg) & chick == 2, 2, egg))

#2013 data having species = 'a', missing egg & chick = 1
x <- with(df, which(is.na(egg) & chick == 1 & sp == 'a' & year == 2013))
x_sample <- sample(x, round(0.8 * length(x)))
df$egg[x_sample] <- 2
df$egg[setdiff(x, x_sample)] <- 1

#2014 data having species = 'a', missing egg & chick = 1
x <- with(df, which(is.na(egg) & chick == 1 & sp == 'a' & year == 2014))
x_sample <- sample(x, round(0.4 * length(x)))
df$egg[x_sample] <- 2
df$egg[setdiff(x, x_sample)] <- 1

给了

> df
   year nestid sp egg chick
1  2013     a1  a   2     1
2  2013     a2  a   2     1
3  2013     a3  a  NA     0
4  2013     a4  a   2     1
5  2013     a5  a  NA     0
6  2013     b1  b   2     0
7  2013     b2  b  NA     1
8  2013     b3  b   2     2
9  2013     b4  b  NA     1
10 2014     a1  a   1     1
11 2014     a2  a   2     1
12 2014     a3  a   1     1
13 2014     a4  a   2     1
14 2014     a5  a   1     1
15 2014     b1  b  NA     1
16 2014     b2  b   2     2
17 2014     b3  b   2     2
18 2014     b4  b  NA     1


样本数据:

df <- structure(list(year = c(2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 
2013L, 2013L, 2013L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 
2014L, 2014L, 2014L), nestid = c("a1", "a2", "a3", "a4", "a5", 
"b1", "b2", "b3", "b4", "a1", "a2", "a3", "a4", "a5", "b1", "b2", 
"b3", "b4"), sp = c("a", "a", "a", "a", "a", "b", "b", "b", "b", 
"a", "a", "a", "a", "a", "b", "b", "b", "b"), egg = c(2L, NA, 
NA, NA, NA, 2L, NA, NA, NA, NA, NA, 1L, NA, NA, NA, NA, NA, NA
), chick = c(1L, 1L, 0L, 1L, 0L, 0L, 1L, 2L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 1L)), .Names = c("year", "nestid", "sp", 
"egg", "chick"), class = "data.frame", row.names = c(NA, -18L
))

【讨论】:

  • 非常感谢您的帮助!现在,我被堆叠了,但我能够继续我的编码。
猜你喜欢
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2018-07-19
相关资源
最近更新 更多