Stata的inlist允许我们引用变量的实数或字符串值.我想知道是否R有这样的功能.
例子:
我想从变量中选择八个状态state(您可以将其视为state任何数据帧中的列,其中state需要50个字符串值(美国的状态)).
inlist(state,"NC","AZ","TX","NY","MA","CA","NJ")
Run Code Online (Sandbox Code Playgroud)
我想从变量中选择九个年龄值age(您可以将其视为age任何数据age框中的列,其中数值从0到90).
inlist(age,16, 24, 45, 54, 67,74, 78, 79, 85)
Run Code Online (Sandbox Code Playgroud)
题:
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
Run Code Online (Sandbox Code Playgroud)
我想你想要%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
Run Code Online (Sandbox Code Playgroud)
编辑:处理更新的问题.
从@ 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.
Run Code Online (Sandbox Code Playgroud)
但是,我不太确定这与原始问题的匹配程度如何.我不太了解Stata,知道它是否z可以是一个向量:它听起来不是那样,在这种情况下,原始问题(考虑z=state作为向量)没有意义.如果我们认为它可以是一个向量,那么答案就是as.numeric(state %in% statevec)- 我想.
编辑:Ananda更新
使用您的更新数据,这是一种方法,再次使用%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
Run Code Online (Sandbox Code Playgroud)
这与您的预期输出匹配,通过使用!(NOT)反转的意义%in%.从我想到它的方式看起来有点倒退(通常,0 = FALSE="不在列表中",1 = TRUE="在列表中")和我对Stata定义的解读,但如果它是什么你要 ...
或者可以使用ifelse更多潜在的灵活性(即0/1以外的值):within(data, { m <- ifelse(age %in% c(1, 7, 9),0,1)})在上面的代码中替换.