如何添加具有特定于分组变量的值的新列
How to add a new column with values specific to grouped variables
我是 R 的新手,已经找到了解决我的问题的类似解决方案,但我正在努力将这些解决方案应用到我的代码中。请帮忙...
这些数据被简化了,因为id变量很多:
df = data.frame(id = rep(c("a_10", "a_11", "b_10", "b_11"), each = 5),
site = rep(1:5, 4),
value = sample(1:20))
目的是添加另一个标有“年份”的列,其中的值按“id”分组,但真实姓名很多 - 所以我试图通过使用结尾数字来简化代码。
我可以使用 dplyr
使用此代码将数据帧拆分为每个 id 变量(对每个 id 变量重复):
df %>%
select(site, id, value) %>%
filter(grepl("10$", id)) %>%
mutate(Year = "2010")`
而不是使用merge
将数据帧重新组合成一个,有没有更简单的方法?
我尝试按照之前的回答中所述将 case_when
修改为 mutate
:
[
mutate(year = case_when(grepl(c("10$", "11$", id) == c("2010", "2011"))))
这样的事情可能吗??
提前致谢
您可以使用 substr
获取 id
的最后两位数字,然后 paste0
将其转换为“20”以重新创建年份。
df |> dplyr::mutate(Year = paste0("20", substr(id, 3, 4)))
#> id site value Year
#> 1 a_10 1 5 2010
#> 2 a_10 2 12 2010
#> 3 a_10 3 9 2010
#> 4 a_10 4 7 2010
#> 5 a_10 5 13 2010
#> 6 a_11 1 3 2011
#> 7 a_11 2 4 2011
#> 8 a_11 3 16 2011
#> 9 a_11 4 2 2011
#> 10 a_11 5 6 2011
#> 11 b_10 1 19 2010
#> 12 b_10 2 14 2010
#> 13 b_10 3 15 2010
#> 14 b_10 4 10 2010
#> 15 b_10 5 11 2010
#> 16 b_11 1 18 2011
#> 17 b_11 2 1 2011
#> 18 b_11 3 20 2011
#> 19 b_11 4 17 2011
#> 20 b_11 5 8 2011
由 reprex package (v2.0.1)
创建于 2022-04-21
如果您的 id
列有不同的字符串长度,您可以使用 sub
:
df %>%
mutate(Year = paste0("20", sub('^.*_(\d+)$', '\1', id)))
#> id site value Year
#> 1 a_10 1 2 2010
#> 2 a_10 2 7 2010
#> 3 a_10 3 16 2010
#> 4 a_10 4 10 2010
#> 5 a_10 5 11 2010
#> 6 a_11 1 5 2011
#> 7 a_11 2 13 2011
#> 8 a_11 3 14 2011
#> 9 a_11 4 6 2011
#> 10 a_11 5 12 2011
#> 11 b_10 1 17 2010
#> 12 b_10 2 1 2010
#> 13 b_10 3 4 2010
#> 14 b_10 4 15 2010
#> 15 b_10 5 9 2010
#> 16 b_11 1 8 2011
#> 17 b_11 2 20 2011
#> 18 b_11 3 19 2011
#> 19 b_11 4 18 2011
#> 20 b_11 5 3 2011
由 reprex package (v2.0.1)
创建于 2022-04-21
我是 R 的新手,已经找到了解决我的问题的类似解决方案,但我正在努力将这些解决方案应用到我的代码中。请帮忙...
这些数据被简化了,因为id变量很多:
df = data.frame(id = rep(c("a_10", "a_11", "b_10", "b_11"), each = 5),
site = rep(1:5, 4),
value = sample(1:20))
目的是添加另一个标有“年份”的列,其中的值按“id”分组,但真实姓名很多 - 所以我试图通过使用结尾数字来简化代码。
我可以使用 dplyr
使用此代码将数据帧拆分为每个 id 变量(对每个 id 变量重复):
df %>%
select(site, id, value) %>%
filter(grepl("10$", id)) %>%
mutate(Year = "2010")`
而不是使用merge
将数据帧重新组合成一个,有没有更简单的方法?
我尝试按照之前的回答中所述将 case_when
修改为 mutate
:
[ 这样的事情可能吗?? 提前致谢mutate(year = case_when(grepl(c("10$", "11$", id) == c("2010", "2011"))))
您可以使用 substr
获取 id
的最后两位数字,然后 paste0
将其转换为“20”以重新创建年份。
df |> dplyr::mutate(Year = paste0("20", substr(id, 3, 4)))
#> id site value Year
#> 1 a_10 1 5 2010
#> 2 a_10 2 12 2010
#> 3 a_10 3 9 2010
#> 4 a_10 4 7 2010
#> 5 a_10 5 13 2010
#> 6 a_11 1 3 2011
#> 7 a_11 2 4 2011
#> 8 a_11 3 16 2011
#> 9 a_11 4 2 2011
#> 10 a_11 5 6 2011
#> 11 b_10 1 19 2010
#> 12 b_10 2 14 2010
#> 13 b_10 3 15 2010
#> 14 b_10 4 10 2010
#> 15 b_10 5 11 2010
#> 16 b_11 1 18 2011
#> 17 b_11 2 1 2011
#> 18 b_11 3 20 2011
#> 19 b_11 4 17 2011
#> 20 b_11 5 8 2011
由 reprex package (v2.0.1)
创建于 2022-04-21如果您的 id
列有不同的字符串长度,您可以使用 sub
:
df %>%
mutate(Year = paste0("20", sub('^.*_(\d+)$', '\1', id)))
#> id site value Year
#> 1 a_10 1 2 2010
#> 2 a_10 2 7 2010
#> 3 a_10 3 16 2010
#> 4 a_10 4 10 2010
#> 5 a_10 5 11 2010
#> 6 a_11 1 5 2011
#> 7 a_11 2 13 2011
#> 8 a_11 3 14 2011
#> 9 a_11 4 6 2011
#> 10 a_11 5 12 2011
#> 11 b_10 1 17 2010
#> 12 b_10 2 1 2010
#> 13 b_10 3 4 2010
#> 14 b_10 4 15 2010
#> 15 b_10 5 9 2010
#> 16 b_11 1 8 2011
#> 17 b_11 2 20 2011
#> 18 b_11 3 19 2011
#> 19 b_11 4 18 2011
#> 20 b_11 5 3 2011
由 reprex package (v2.0.1)
创建于 2022-04-21