R中case_when函数的向量大小错误

9rnv2umw  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(93)

最小的工作示例。我不明白为什么v2011没有很好地定义。

myDf <- data.frame(
Year = c(2010, 2012, 2013, 2010:2013),
value = rnorm(7),
group = c(rep("A", 3), rep("B", 4))
)

myDf %>%
  group_by(group) %>%
  mutate(v2010 = case_when(2010 %in% Year ~ value[Year == 2010], T ~ NA),
         v2011 = case_when(2011 %in% Year ~ value[Year == 2011], T ~ NA))

字符串

6kkfgxo0

6kkfgxo01#

对于长度为1的测试(每组),可以直接使用if(){} else{}。与ifelseif_elsecase_when等向量化函数不同,if(){}中的代码只有在条件为真时才会被计算。

myDf %>%
  group_by(group) %>%
  mutate(
    v2010 = if(2010 %in% Year) value[Year == 2010] else NA,
    v2011 = if(2011 %in% Year) value[Year == 2011] else NA
  )
# # A tibble: 7 × 5
# # Groups:   group [2]
#    Year  value group  v2010  v2011
#   <dbl>  <dbl> <chr>  <dbl>  <dbl>
# 1  2010  0.233 A      0.233 NA    
# 2  2012 -1.30  A      0.233 NA    
# 3  2013  1.42  A      0.233 NA    
# 4  2010 -0.685 B     -0.685  0.718
# 5  2011  0.718 B     -0.685  0.718
# 6  2012  0.447 B     -0.685  0.718
# 7  2013  0.816 B     -0.685  0.718

字符串
当然,您的操作并不能很好地推广--如果您想对1或2列以上的列执行此操作,则会变得重复,并且会使代码变得烦人。一种替代方法是过滤、透视和连接。通过调整filter,您可以使用相同的代码量在1年或多年内执行此操作:

library(tidyr)
myDf |> 
  filter(Year %in% c(2010, 2011)) |>
  pivot_wider(id_cols = group, names_from = Year, names_prefix = "v", values_from = value) |>
  right_join(myDf)
# Joining with `by = join_by(group)`
# # A tibble: 7 × 5
#   group  v2010  v2011  Year  value
#   <chr>  <dbl>  <dbl> <dbl>  <dbl>
# 1 A      0.233 NA      2010  0.233
# 2 A      0.233 NA      2012 -1.30 
# 3 A      0.233 NA      2013  1.42 
# 4 B     -0.685  0.718  2010 -0.685
# 5 B     -0.685  0.718  2011  0.718
# 6 B     -0.685  0.718  2012  0.447
# 7 B     -0.685  0.718  2013  0.816

svdrlsy4

svdrlsy42#

我觉得

value[Year == 2011]

字符串
即使2011年不在年份中,也要进行评估。
这可能有助于理解发生了什么:

myDf %>%
  group_by(group) %>%
  mutate(v2010 = case_when(2010 %in% Year ~ value[Year == 2010], 
                           T ~ NA),
         v2011 = case_when(3000 %in% Year ~ stop("this is being evaluated!"), 
                           T ~ NA_integer_)
  )


您可以用途:

myDf %>%
  group_by(group) %>% 
  mutate(v2010 = ifelse(is_empty(value[Year==2010]), NA_integer_, value[Year==2010]),
         v2011 = ifelse(is_empty(value[Year==2011]), NA_integer_, value[Year==2011]))

cwtwac6a

cwtwac6a3#

不要使用value[Year == 2011]。发生错误的原因是第一组('A')中没有2011年。相反,检查是否没有这样的值(!length(value[year == 2011])),并将NA放在以下情况中:

set.seed(123)

myDf %>%
    group_by(group) %>%
    mutate(
        v2010 = case_when(2010 %in% Year ~ ifelse(!length(value[Year == 2010]),
                                                  NA,
                                                  value[Year == 2010]), T ~ NA),
        v2011 = case_when(2011 %in% Year ~ ifelse(!length(value[Year == 2011]),
                                                  NA,
                                                  value[Year == 2011]), T ~ NA)
    )

# A tibble: 7 × 5
# Groups:   group [2]
   Year   value group   v2010  v2011
  <dbl>   <dbl> <chr>   <dbl>  <dbl>
1  2010 -0.0867 A     -0.0867 NA    
2  2012  1.44   A     -0.0867 NA    
3  2013  1.13   A     -0.0867 NA    
4  2010  0.834  B      0.834  -0.287
5  2011 -0.287  B      0.834  -0.287
6  2012  0.373  B      0.834  -0.287
7  2013  0.403  B      0.834  -0.287

字符串

相关问题