我有一个很大的data.frame,需要创建一个列为“月”的类别变量为“季节”的列。
structure(list(year = c("2017", "2017", "2017", "2017", "2017",
"2017", "2017", "2017", "2017", "2017", "2017", "2017", "2017",
"2017", "2017", "2017", "2017", "2017", "2017", "2017", "2017",
"2017", "2017", "2017", "2017", "2017", "2017", "2017", "2017",
"2017", "2017", "2017", "2017", "2017", "2017", "2017", "2017",
"2017", "2017", "2017", "2017", "2017", "2017", "2017", "2017",
"2017", "2017", "2017", "2017", "2017"), month = c(1, 2, 2, 1,
1, 3, 3, 3, 3, 4, 4, 4, 4, 4, 3, 1, 3, 3, 4, 5, 1, 2, 2, 2, 2,
3, 1, 1, 2, 3, 4, 5, 6, 2, 5, 8, 1, 1, 4, 2, 3, 4, 2, 2, 2, 3,
3, 4, 4, 1), day = c("29", "12", "12", "25", "25", "01", "01",
"29", "29", "10", "10", "10", "10", "10", "14", "31", "02", "28",
"25", "31", "21", "18", "12", "01", "01", "28", "07", "18", "16",
"30", "26", "24", "22", "12", "16", "13", "10", "10", "11", "01",
"28", "29", "04", "01", "01", "28", "28", "29", "29", "10")), row.names = c(NA,
-50L), class = c("tbl_df", "tbl", "data.frame"))
我使用了像下面这样的ifelse函数:
a <- c(3,4,5)
b <- c(6,7,8)
c <- c(9,10,11)
d <- c(12,1,2)
df$season <- ifelse(df$month == a, "Spring",
ifelse(df$month == b, "Summer",
ifelse(df$month == c, "Fall",
ifelse(df$month == d, "Winter",
""))))
但是在“季节”列中我得到了错误的关联。许多应该具有季节名称的值是“”。
我也尝试过:
df[df$month == a, ][, "Season"] <- "Spring"
df[df$month == b, ][, "Season"] <- "Summer"
df[df$month == c, ][, "Season"] <- "Fall"
df[df$month == d, ][, "Season"] <- "Winter"
但这没用。
答案 0 :(得分:3)
在这里,问题在于每个vector
元素都属于length
>1。为此,我们可以使用%in%
df$season <- ifelse(df$month %in% a, "Spring",
ifelse(df$month %in% b, "Summer",
ifelse(df$month %in% c, "Fall",
ifelse(df$month %in% d, "Winter",
""))))
此外,我们可以在tidyverse
中完成
df %>%
mutate(season = case_when(month %in% a ~ "Spring",
month %in% b ~ "Summer",
month %in% c ~ "Fall",
month %in% dd ~ "Winter",
TRUE ~ NA_character_))
如果有很多值,则在创建键/值数据集后会加入一种更好的方法
library(tidyverse)
map2_df(lst(a, b, c, d), c("Spring", "Summer", "Fall", "Winter"),
~ tibble(month = .x, val = .y)) %>%
right_join(df) %>%
select(month = val, year, day)
答案 1 :(得分:2)
您应该这样做:
df$season <- ifelse(df$month %in% a, "Spring",
ifelse(df$month %in% b, "Summer",
ifelse(df$month %in% c, "Fall",
ifelse(df$month %in% d, "Winter",
""))))
由于使用的是“ ==”,因此仅将df $ month与a,b,c和d的前几个元素进行比较。