繁体   English   中英

R:如何循环从数据框中选择基于名称的变量,并为每个变量创建一个包含第一个列均值的新变量?

[英]R: How to loop over a name-based selection of variables from a dataframe and for each create a new variable containing the column mean of the first?

我有一个数据集,其中包含许多名称都以“排名”开头的数字变量。 对于这些变量中的每一个,我想将另一个变量添加到包含第一个变量的列均值的数据集中。

所以数据看起来像这样:

| Ranking_blah | Ranking_bleh | 

| --------     | ----------   |

| 1            | 0            |

| 0            | 1            |

| NA           | 0.5          |

我想要的是:

| Ranking_blah | Ranking_bleh | Ranking_blah_mean | Ranking_bleh_mean |

| --------     | ----------   |----------------   |----------------|

| 1            | 0            | 0                 | 0.5            |

| -1           | 1            | 0                 | 0.5            |

| NA           | 0.5          | 0                 | 0.5    

(我知道这样平均变量在所有行中分别具有相同的值 - 我需要这个,因为稍后将重新调整数据)

到目前为止我已经尝试过:

#getting a list of all ranking variables I want to create a new mean variable from

ranking_variables = names(data)[grepl("Ranking", names(data))]

#creating a new variable for each base variable in the list and setting it to the mean of the respective base variable

data[paste0(ranking_variables, "_mean")] <- do.call(cbind, lapply(data[ranking_variables], function(x) mean(x, na.rm = TRUE)))

但是,第二部分不起作用,它只产生 NA 值。 我究竟做错了什么?

另一种方法是使用dplyr across cross :

dat |>
    mutate(across(starts_with("Ranking"), ~ mean(., na.rm = TRUE), .names = "{.col}_mean"))

输出:

# A tibble: 3 × 4
  Ranking_blah Ranking_bleh Ranking_blah_mean Ranking_bleh_mean
         <dbl>        <dbl>             <dbl>             <dbl>
1            1          0                   0               0.5
2           -1          1                   0               0.5
3           NA          0.5                 0               0.5

数据:

tibble(Ranking_blah = c(1,-1,NA), Ranking_bleh = c(0,1,0.5))

across方法很好,这是另一种方法:

整洁的数据没有那么困难,因为 R 使得跨行计算比跨列计算更容易。

整齐的数据意味着每个观察都有自己的行,每个变量都有自己的列。 列旨在表示变量。 我认为“排名...”列不是不同的变量,而是对变量“类型”的不同观察。 为了解决这个问题,我们可以使用tidyr
有关数据科学,请参阅 R 的这一章。

library(tidyverse)

data <- data.frame(Ranking_blah = c(1,-1,NA), Ranking_bleh = c(0,1,0.5))
data$id <- c(1:nrow(data))

pivot_longer(data,1:2,names_to = "type") %>%
  group_by(type) %>%
  mutate(mean = mean(value, na.rm = TRUE)) %>%
  ungroup()
# A tibble: 6 × 4
     id type         value  mean
  <int> <chr>        <dbl> <dbl>
1     1 Ranking_blah   1     0  
2     1 Ranking_bleh   0     0.5
3     2 Ranking_blah  -1     0  
4     2 Ranking_bleh   1     0.5
5     3 Ranking_blah  NA     0  
6     3 Ranking_bleh   0.5   0.5

这些数据不太可读,但对 R 更友好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM