9

我数据库中的变量被编码为“是”和“否”,但我想有“1”和“2”。

我尝试使用创建一个新变量,ifelse但是当我list编辑它时,它不起作用,如下所示:

CA <- ifelse((CANCER == "Yes"),1
ifelse(( CANCER == "No"),2 )))

list(CA)

[[1]]
NULL
4

7 回答 7

19

如果你想使用ifelse

CA <- ifelse(CANCER=="Yes", 1, 2)
于 2012-08-20T04:28:28.017 回答
7

假设

levels(CANCER) 

返回

Levels: yes no

如果您只是说,这可能对您来说是最简单的

CA<-factor(as.numeric(CANCER))

但是,通常您也可以使用

Cancer<-factor(CANCER)

比假设

levels(Cancer) 

返回

Levels: yes no

您可以更改级别

levels(Cancer)[1]<-"1"
levels(Cancer)[2]<-"2"

或相应地切换标签。

于 2012-08-19T23:18:47.837 回答
2

我们需要知道您的变量是否是一个因素。认为

foo <- c("yes","no","no","yes")

如果 is.factor(foo) 返回 TRUE,例如,如果你这样做了foo <- factor(foo),那么使用

levels(foo) <- c("2", "1")

否则使用

foo[foo == "yes"] <- 1
foo[foo == "no"] <- 2

此外, list() 不会做(我认为)你认为它会做的事情。如果要查看 foo 的值,只需输入 foo。执行上面的代码后...

foo
[1] 1 2 2 1
于 2012-08-19T23:35:49.993 回答
2

我只是想补充一点(因为当我第一次遇到这种类型的事情时它对我很有帮助)除非明确说明,否则因子的水平按字母顺序排列。

这不适用于这个特定问题,因为 CANCER 列中的因子水平是明确排序的。但是,对于使用读取的任何“是”/“否”编码数据集

my_df <- read.csv(file = "myfile.csv", stringsAsFactors = TRUE)

“否”将被编码为1,“是”将被编码为2,因为 N 在字母表中位于 Y 之前。

因此,在这样的环境中:

my_df$CANCER <- as.numeric(my_df$CANCER) - 1

将非常有用,因为现在每个“否”都是 a 0,每个“是”都是1

希望这对那里的人有帮助。

于 2017-06-14T13:12:32.173 回答
1

如果您强制使用按顺序设置的级别的因素"yes","no"

foo <- factor(c("yes","no","no","yes"),levels=c("yes","no"))

您可以简单地强制转换为数字:

as.numeric(foo)

这给了你:

[1] 1 2 2 1
于 2012-08-20T07:55:20.590 回答
0

或者-如果您有两个以上的选项,可能会更灵活-您可以使用该merge()功能。

例如,如果您有此数据框:

dtf <- data.frame(CANCER = c("No", "Yes", "Yes", "No"),
                  x = c(4, 5, 6, 7), 
                  # Keep character variables as characters, do not create factors
                  stringsAsFactors = FALSE) 

您可以将值编码的新方法存储在另一个数据框中:

moreinfo <- data.frame(CANCER = c("Yes", "No"),
                       CA = c(1, 2), 
                       stringsAsFactors = FALSE)

然后将其与原始数据框合并:

merge(dtf, moreinfo, by = "CANCER")

  CANCER x CA
1     No 4  2
2     No 7  2
3    Yes 5  1
4    Yes 6  1

注意:对不起这个stringsAsFactors参数,有必要防止 R 用你的字符变量自动创建因子,我建议你在加载数据时也使用它read.csv()

于 2017-09-20T10:03:06.910 回答
0

聚会有点晚了,但你可以用 dplyr mutate 和 revalue

cancer_dat <- data.frame(CANCER = c("No", "Yes", "Yes", "No"),
                  x = c(4, 5, 6, 7))

cancer_dat =cancer_dat %>% mutate(CANCER = revalue(factor(cancer_dat$CANCER),
                                       c("Yes" = "1", "No" = "0")))

revalue 允许您以“旧名称”、“新名称”的形式将因子名称更改为其他名称

于 2018-07-19T21:28:42.163 回答