gpt4 book ai didi

r - 我猜在 dplyr 中的另一列上添加新列不起作用

转载 作者:行者123 更新时间:2023-12-04 08:07:21 25 4
gpt4 key购买 nike

我是 R 的新手,我想使用 dplyr 在另一列的基础上创建一个新列。我在网上阅读了解决方案,但我的问题并不顺利。
我有一个这样的范围数据集(以字符串形式):

df = data.frame(my_range = c("0-14", "15-24", "25-34"))
  my_range
1 0-14
2 15-24
3 25-34
我可以使用以下代码计算这些字符串的平均值:
> mean(as.integer(unlist(strsplit("0-14", "-"))))
> 7
我想创建一个名为 range_mean 的新列其中包含 my_range 中每个元素的平均值柱子。我认为这可能会奏效:
> library(dplyr)
> df %>%
+ mutate(range_mean = mean(as.integer(unlist(strsplit(my_range, "-")))))
但结果并不是我想的那样。我不明白为什么会这样:
  my_range range_mean
1 0-14 18.66667
2 15-24 18.66667
3 25-34 18.66667
我试图研究以找到解决方案,但我失败了。我在这里问我如何创建这样的新列?
  my_range range_mean
1 0-14 7
2 15-24 19.5
3 25-34 29.5

最佳答案

一个选项是 separate将列分成两个数字列( remove = FALSE ),然后使用 map2遍历相应的列,得到 mean元素向量的

library(dplyr)
library(purrr)
library(tidyr)
df %>%
separate(my_range, into = c('start', 'end'), convert = TRUE,
remove = FALSE) %>%
transmute(my_range, range_mean = map2_dbl(start, end, ~ mean(c(.x, .y))))
-输出
# my_range range_mean
#1 0-14 7.0
#2 15-24 19.5
#3 25-34 29.5

问题是 unlist正在取消列出整个列,因此 mean该列上是所有值的平均值,除非有分组,即使用 OP 的代码,我们可以添加 rowwise
df %>% 
rowwise %>%
mutate(range_mean = mean(as.integer(unlist(strsplit(my_range, "-"))))) %>%
ungroup
-输出
# A tibble: 3 x 2
# my_range range_mean
# <chr> <dbl>
#1 0-14 7
#2 15-24 19.5
#3 25-34 29.5

或者它可以简化为 rowMeans作为矢量化选项
rowMeans(read.table(text = df$my_range, sep="-", header = FALSE))
#[1] 7.0 19.5 29.5

关于r - 我猜在 dplyr 中的另一列上添加新列不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66162537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com