【问题标题】:Getting the wrong association with ifelse function获得与 ifelse 函数的错误关联
【发布时间】:2019-08-19 17:14:21
【问题描述】:

我有一个很大的 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"

但它不起作用。

【问题讨论】:

  • 使用%in% 而不是==

标签: r


【解决方案1】:

这里的问题是每个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_))

如果有很多值,更好的方法是在创建 key/val 数据集后加入

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)

【讨论】:

  • 非常感谢!很好的解释!
【解决方案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 的第一个元素进行比较。

【讨论】:

  • 太棒了!非常感谢!
  • Lennyy,我正在尝试对具有十进制数字的变量执行相同的操作。但它不起作用。该类是“数字”的,但它不起作用。例如,我有一个
猜你喜欢
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2018-09-26
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多