通过子集

时间:2018-03-14 13:32:26

标签: r variables subset

这是我的第一个问题,所以请耐心等待我

我正在使用现有变量age.f.sex在我的数据框wm.13中创建一个新变量SB1。在原始数据框中,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()未展示的新来鸟,但只要我使用unique()
  • 就会出现

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

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

我用NAs替换了0,97和99值,并且我将原始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()可能会在这里使用,但我无法弄清楚他们的论点。我在本网站上找到的示例显示了如何归因于一个特定值,但根据观察值在另一个变量中的值,我找不到关于子集的任何内容。

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

谢谢,Manolo

2 个答案:

答案 0 :(得分:0)

也许你可以试试:

IF NOT "%1"=="" goto :skipOpenResult
CALL:ECHORED "Open result file? Y[yes] or N[exit]"
choice /c yn /n
if %errorlevel%==1 
(   
    if exist %resultFile% 
    (
        start %resultFile%
    ) 
    else 
    (
        CALL:ECHORED "File not found: %resultFile%"
    )
)
:skipOpenResult

简而言之,它的工作原理如下:代码检查wm.13 $ SB1是0,97,99还是缺失,然后返回NA。随后,它检查wm.13 $ SB1是否为95,如果是,则返回MA9列中该行的值。在所有其他情况下,它返回SB1值。由于行开头的“wm.13 $ age.f.sex&lt; - ”,返回值将分配给新的age.f.sex变量。

答案 1 :(得分:0)

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

# 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))