【问题标题】:setting variable value by subsetting通过子集设置变量值
【发布时间】:2018-03-14 22:23:02
【问题描述】:

这是我的第一个问题,请多多包涵

我正在使用已经存在的变量 SB1 在我的数据框 wm.13 中创建一个新变量 age.f.sex。在原始数据框中,SB1 表示联合国儿童基金会多指标类集调查中受访女性的首次性交年龄。 SB1 可以取的值是:

> sort(unique(wm.13$SB1))
[1]  0  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
[26] 30 31 32 33 34 35 36 37 38 39 40 41 42 44 48 95 97 99

这里是SB1可以取的值的含义

  • 0 表示她从未发生过性行为
  • 97 和 99 表示“不记得/不知道”
  • 95 表示她在开始与丈夫/伴侣生活时进行了第一次性交(有一个特定变量,即MA9
  • 0 到 95 之间的任何数字是他们第一次性交的声明年龄
  • 还有sort() 没有显示的NA,但如果我只使用unique(),它们就会出现

我从SB1 创建了一个新变量,我称之为age.f.sex

wm.13$age.f.sex <- wm.13$SB1

我将 0、97 和 99 值替换为 NA,并将原始 NA 保留在 SB1 中。我使用以下代码做到了这一点:

wm.13$age.f.sex[wm.13$SB1 == 0] <- NA
wm.13$age.f.sex[wm.13$SB1 == 97] <- NA
wm.13$age.f.sex[wm.13$SB1 == 99] <- NA
wm.13$age.f.sex[is.na(wm.13$SB1)] <- NA

直到这里一切正常。但是,我遇到了 95 值的问题。我想编码,以便在SB1(即第一次性交的年龄)中具有价值 95 的观察值将具有来自 MA9(即女性开始与伴侣/丈夫生活的年龄)的值新变量age.f.sex

我是从这段代码开始的

> wm.13$age.f.sex[wm.13$SB1 == 95] <- wm.13$MA9

但我收到以下错误消息

Error in wm.13$age.f.sex[wm.13$SB1 == 95] <- wm.13$MA9 : 
  NAs are not allowed in subscripted assignments

在这个网站上进行了一些研究后,我意识到我可能也需要对代码的右侧进行子集化,但老实说我不知道​​该怎么做。我有一种感觉,which()if.else() 可能会在这里派上用场,但我无法弄清楚他们的论点。我在这个网站上找到的例子展示了如何估算一个特定的值,但是根据观察值在另一个变量中的值,我找不到任何关于子集的东西。

我希望我已经足够清楚了。任何建议将不胜感激。

谢谢,马诺洛

【问题讨论】:

    标签: r variables subset


    【解决方案1】:

    也许你可以试试:

    wm.13$age.f.sex <- ifelse(wm.13$SB1 %in% c(0,97,99) | is.na(wm.13$SB1), NA, ifelse(wm.13$SB1 == 95, wm.13$MA9, wm.13$SB1))
    

    简而言之,它的工作原理是这样的:代码检查 wm.13$SB1 是否为 0、97、99 或缺失,然后返回 NA。随后,它检查 wm.13$SB1 是否为 95,如果是,则返回 MA9 列中该行的值。在所有其他情况下,它返回 SB1 值。由于行首的“wm.13$age.f.sex

    【讨论】:

    • 谢谢,这似乎是正确的方式。但是,如果我运行 &gt; sort(unique(wm.13$age.f.sex), na.last = FALSE) 我得到 [1] NA 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [26] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 97 99 95s 和 0s 似乎已经变成了 NA,但 97s 和 99s 仍然存在。我应该将c(0, 97, 99)| 运算符分开吗?
    • 这很奇怪,它对我有用,你复制粘贴上面的代码吗?你的 SB1 变量的类别是什么?我认为它应该是数字或整数。如果它是您数据框中的一个因素,我可以想象它无法正常工作
    • 对不起,我写了一个不正确的东西,错误只针对 97 和 99 的值。我复制并粘贴了您的代码,SB1 是一个整数。我认为这与ifelse 的顺序有关,所以我尝试了wm.13$age.f.sex &lt;- ifelse(wm.13$SB1 == 95, wm.13$MA9, ifelse(wm.13$SB1 %in% c(0,97,99) | is.na(wm.13$SB1), NA, wm.13$SB1)),但得到了相同的结果。如果我这样做wm.13$age.f.sex &lt;- wm.13$SB1wm.13$age.f.sex &lt;- ifelse(wm.13$SB1 == 95, wm.13$MA9, wm.13$SB1)wm.13$age.f.sex[wm.13$SB1 == 0] &lt;- NAwm.13$age.f.sex[wm.13$SB1 == 97] &lt;- NAwm.13$age.f.sex[wm.13$SB1 == 99] &lt;- NA
    • 愚蠢的错误,我的 MA9 变量也有 97 和 99 的值。我将它们更改为 NA,现在一切正常。干杯!
    【解决方案2】:

    如错误消息所示,当过滤器包含 NA 时,无法进行下标赋值。避免这种情况的一种方法是将 NA 明确包含为factor 级别。以下示例说明了将95s 替换为第二列中的相应值的可能方法。

    # example dataframe
    df <- data.frame(a = c(NA, 3, 95, NA),
                     b = 1:4)
    
    # set a to factor with NA as one of the levels (besides those in a and b)
    df$a <- factor(df$a, levels = union(df$a, df$b), exclude = NULL)
    
    # subscripted assignment (don't forget to filter b too!)
    df$a[df$a == 95] <- df$b[df$a == 95]
    
    # restore to numeric
    df$a <- as.numeric(as.character(df$a))
    

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      相关资源
      最近更新 更多