根据先前变量是否在向量(R)中创建一个新的二进制变量

时间:2019-05-10 16:12:32

标签: r for-loop if-statement

我有一个问题的答案列表,我需要根据这些答案创建一个新变量,将其分为两类。这是根据响应出现在两个列表中的哪个列表上来完成的:一个包含所有要重新编码为一个类别的响应(即,新变量的值为0),另一个包含所有要重新编码为新变量的响应。如1.

我试图通过一个for循环使它起作用,该循环遍历每一行,测试响应变量,并根据响应所在的列表将新值分配给新变量,但是当我运行它时不管旧变量如何,这都会为新变量的每一行赋值为1。

可复制的示例:

df <- data.frame(state = state.name)
# create the reference lists
AtoM <- df$state[1:26]
NtoZ <- df$state[27:50]

for (i in seq_along(df$state)) {
  if (df$state[i] %in% AtoM) {
    df$state.bin <- 0
  } else if (df$state[i] %in% NtoZ) {
    df$state.bin <- 1
  } else {
    df$state.bin <- NA
  }
}
View(df) # when the result is viewed, the new state.bin variable has a value of 1 for every row

应该为前26个状态分配新变量的值0,但它们都被分配为1。但是当我测试df$state[1] %in% AtoM时,它返回TRUE

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

您需要给索引指定df$state.bin中要放置值的位置(df$state.bin[i],就像对df$state[i]所做的一样),并且还需要创建一个占位符变量在您对df所做的原始state.bin = 0中使用。

df <- data.frame(state = state.name,
                 state.bin = 0)
# create the reference lists
AtoM <- df$state[1:26]
NtoZ <- df$state[27:50]

for (i in seq_along(df$state)) {
  if (df$state[i] %in% AtoM) {
    df$state.bin[i] <- 0
  } else if (df$state[i] %in% NtoZ) {
    df$state.bin[i] <- 1
  } else {
    df$state.bin[i] <- NA
  }
}

> df

            state state.bin
1         Alabama         0
2          Alaska         0
3         Arizona         0
4        Arkansas         0
5      California         0
6        Colorado         0

您也可以使用dplyr

df <- data.frame(state = state.name)
# create the reference lists
AtoM <- df$state[1:26]
NtoZ <- df$state[27:50]

df %>%
  mutate(state.bin = case_when(
    state %in% AtoM ~ 0,
    state %in% NtoZ ~ 1,
    TRUE ~ NA_real_
  ))

            state state.bin
1         Alabama         0
2          Alaska         0
3         Arizona         0
4        Arkansas         0
5      California         0
6        Colorado         0