我正在尝试检查一个变量的值,如果它满足某个条件,则新变量设置为1,否则设置为零。
我在R中遇到这个问题。
这个简单的代码不起作用:
attach(data)
if (Drug = 1) {
Drug_factor <- 0
} else {
if (Drug = 2) {
Drug_factor <- 1
} else Drug_factor<- 0
我不明白为什么这不起作用。 为什么R使用这些复杂的约定做基本的东西?
答案 0 :(得分:2)
您可以使用ifelse
Data$Drug_factor <- with(Data, ifelse(Drug==1, 0, 1))
或使用factor
方法
Data$Drug_factor <- with(Data, as.numeric(as.character(factor(Drug,
levels=1:2, labels=0:1))))
或者
Data$Drug_factor <- c(0,1)[(Data$Drug==2)+1]
甚至更短的假设'药物'是'数字'
Data$Drug_factor <- c(0,1)[Data$Drug]
所有这些情况,假设'药物'中只有两个unique
元素。
假设你在'Drug'中有超过2个独特元素,从代码中可以看出,只有当'Drug == 2'时,该值应该返回为1.在'Drug'中创建另一个值
Data$Drug[4] <- 3
在这种情况下,我们可以更改ifelse
条件,以便当'Drug'为2时返回1并且所有其他人返回0。
Data$Drug_factor <- with(Data, ifelse(Drug==2, 1, 0))
索引的类似选项是,
Data$Drug_factor <- c(0,1)[(Data$Drug==2)+1]
set.seed(24)
Data <- data.frame(Drug= sample(1:2, 10, replace=TRUE), val=rnorm(10))
答案 1 :(得分:1)
有两种不同类型的问题。
在简单的情况下,您希望将少量值更改为其他值。为此,我发现使用plyr中的mapvalues()
是一个很好的解决方案。例如:
#lets pretend we have loaded some data where missing data is coded as 99
set.seed(1) #reproducible results
test_data = sample(c(0:5, 99), size = 1000, replace = T)
#table of our dta
table(test_data)
输出:
test_data
0 1 2 3 4 5 99
138 145 150 150 127 142 148
重新编码:
#recode 99 to NA
library(plyr)
test_data_noNA = mapvalues(test_data, 99, NA)
table(test_data_noNA, exclude = NULL) #also count NAs
输出:
test_data_noNA
0 1 2 3 4 5 <NA>
138 145 150 150 127 142 148
在另一种情况下,您希望有条件地将值更改为其他值,但可能存在大量/不确定/无限数量的值。
示例:
#continuous data
set.seed(1) #reproducible results
test_data = rnorm(1000) #normally distributed data
hist(test_data) #plot with histogram
但是,假设我们想要处理异常值,我们将其定义为超出平均值2SD。但是,我们不只是想要排除它们,所以我们将重新编码它们。
#change values above 2 to 2
test_data[test_data > 2] = 2
#change valuesbelow -2 to -2
test_data[test_data < -2] = -2
hist(test_data) #plot with histogram