我有一个问题的答案列表,我需要根据这些答案创建一个新变量,将其分为两类。这是根据响应出现在两个列表中的哪个列表上来完成的:一个包含所有要重新编码为一个类别的响应(即,新变量的值为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
。
我在做什么错了?
答案 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