9

Stata 的inlist允许我们引用变量的真实值或字符串值。我想知道是否R有这样的功能。

例子:

我想从变量中选择八个州state(您可以将其视为state任何数据框中的列,其中包含state50 个字符串值(美国各州))。

    inlist(state,"NC","AZ","TX","NY","MA","CA","NJ")

我想从变量中选择九个年龄值age(您可以将其视为age任何数据框中的列,其中age数值从 0 到 90)。

    inlist(age,16, 24, 45, 54, 67,74, 78, 79, 85) 

问题:

age<-c(0:10) # for this problem age takes values from 0 to 10 only
data<-as.data.frame(age) # age is a variable of data frame data
data$m<-ifelse(c(1,7,9)%in%data$age,0,1) # generate a variable m which takes  value 0 if age is 1, 7, and 8 and 1, otherwise
Expected output: 
   age m
1    0 1
2    1 0
3    2 1
4    3 1
5    4 1
6    5 1
7    6 1
8    7 0
9    8 1
10   9 0
11  10 1
4

1 回答 1

8

我想你想要%in%

statevec <- c("NC","AZ","TX","NY","MA","CA","NJ")
state <- c("AZ","VT")
state %in% statevec ## TRUE FALSE
agevec <- c(16, 24, 45, 54, 67,74, 78, 79, 85) 
age <- c(34,45)
age %in% agevec ## FALSE TRUE

编辑:处理更新的问题。

从@NickCox 的链接复制:

inlist(z,a,b,...)
      Domain:       all reals or all strings
      Range:        0 or 1
      Description:  returns 1 if z is a member of the remaining arguments;
                        otherwise, returns 0.  All arguments must be reals
                        or all must be strings.  The number of arguments is
                        between 2 and 255 for reals and between 2 and 10 for
                        strings.

但是,我不太确定这与原始问题是否匹配。我不太了解Stata,无法知道是否z可以是向量:听起来不是这样,在这种情况下,原始问题(考虑z=state为向量)没有意义。如果我们认为它可以是一个向量,那么答案将是as.numeric(state %in% statevec)——我认为。

编辑:阿南达更新

使用您更新的数据,这是一种方法,再次使用%in%

data <- data.frame(age=0:10)
within(data, {
    m <- as.numeric(!age %in% c(1, 7, 9))
})
   age m
1    0 1
2    1 0
3    2 1
4    3 1
5    4 1
6    5 1
7    6 1
8    7 0
9    8 1
10   9 0
11  10 1

这与您的预期输出相匹配,通过使用!(NOT) 来反转%in%. 这似乎与我的想法有点倒退(通常,0== FALSE“不在列表中”和 1== TRUE“在列表中”)以及我对 Stata 定义的阅读,但如果是这样的话你要 ...

或者可以使用ifelse更多潜在的灵活性(即 0/1 以外的值):within(data, { m <- ifelse(age %in% c(1, 7, 9),0,1)})在上面的代码中替换。

于 2013-01-12T16:30:25.573 回答