有条件地更改data.frame中的值

时间:2015-09-06 04:19:45

标签: r

我正在尝试检查一个变量的值,如果它满足某个条件,则新变量设置为1,否则设置为零。

我在R中遇到这个问题。

这个简单的代码不起作用:

attach(data)
if (Drug = 1) {
   Drug_factor <- 0
} else {
   if (Drug = 2) {
      Drug_factor <- 1
   } else  Drug_factor<- 0

我不明白为什么这不起作用。 为什么R使用这些复杂的约定做基本的东西?

2 个答案:

答案 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

enter image description here

但是,假设我们想要处理异常值,我们将其定义为超出平均值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

enter image description here