R 在存储在多列上的数据框中查找值
我试图计算演员们为电影创造的平均收入。在我的数据集中,这是由gross定义的,如下面的代码片段所示:R 在存储在多列上的数据框中查找值,r,loops,lookup,R,Loops,Lookup,我试图计算演员们为电影创造的平均收入。在我的数据集中,这是由gross定义的,如下面的代码片段所示: movie_title actor_1_name actor_2_name actor_3_name ... gross x Christoph Waltz Johnny Depp Emma Stone x 309404152 x Mark Addy Christopher Lee Naom
movie_title actor_1_name actor_2_name actor_3_name ... gross
x Christoph Waltz Johnny Depp Emma Stone x 309404152
x Mark Addy Christopher Lee Naomi Watts x 73058679
x Will Smith Tom Hanks *NA* x 179020854
x Tony Curran Jeremy Renner Matt Damon x 93417865
x Chris Evans Eva Green *NA* x 85313679
..etc
我做的第一件事是将三个actor_X_name列转换为一列唯一的actor name,如下所示:
actors <- unique(data.frame(actor_name = c(df[,"actor_1_name"], df[,"actor_2_name"], df[,"actor_3_name"])))
上面返回一个新的数据帧,其中包含来自原始数据集的唯一参与者名称的单列
我如何才能最好地通过这些4900个观察值进行交互,在原始数据框中查找actor_X_name的3个条件的值?目标是获取匹配行的总值,以便我可以据此进行计算。给定您的输入:
df <- tibble::tribble(~title, ~actor_1_name, ~actor_2_name, ~actor_3_name, ~gross,
"A", "Christoph Waltz", "Johnny Depp", "Emma Stone", 309404152,
"B", "Mark Addy", "Christopher Lee", "Naomi Watts", 73058679 ,
"C", "Will Smith", "Tom Hanks", NA, 179020854,
"D", "Tony Curran", "Jeremy Renner", "Matt Damon", 93417865,
"E", "Chris Evans", "Eva Green", NA, 85313679)
df
#> # A tibble: 5 x 5
#> title actor_1_name actor_2_name actor_3_name gross
#> <chr> <chr> <chr> <chr> <dbl>
#> 1 A Christoph Waltz Johnny Depp Emma Stone 309404152
#> 2 B Mark Addy Christopher Lee Naomi Watts 73058679
#> 3 C Will Smith Tom Hanks NA 179020854
#> 4 D Tony Curran Jeremy Renner Matt Damon 93417865
#> 5 E Chris Evans Eva Green NA 85313679
使用匹配项可以选择所有以这种方式编写的列
使用pivot_执行的操作是重塑数据的形状,使匹配项选择的列成为一列,并对每行重复其他列的内容
标题和总额将作为每行的唯一标识符
如果需要计算每个参与者的平均毛额,可以使用:
library(tidyr)
library(dplyr)
df %>%
pivot_longer(matches("actor_\\d_name"), values_to = "actor_name") %>%
filter(!is.na(actor_name)) %>%
group_by(actor_name) %>%
summarise(mean_gross = mean(gross), .groups = "drop")
#> # A tibble: 14 x 2
#> actor_name mean_gross
#> <chr> <dbl>
#> 1 Chris Evans 85313679
#> 2 Christoph Waltz 309404152
#> 3 Christopher Lee 73058679
#> 4 Emma Stone 309404152
#> 5 Eva Green 85313679
#> 6 Jeremy Renner 93417865
#> 7 Johnny Depp 309404152
#> 8 Mark Addy 73058679
#> 9 Matt Damon 93417865
#> 10 Naomi Watts 73058679
#> 11 Tom Hanks 179020854
#> 12 Tony Curran 93417865
#> 13 Will Smith 179020854
注意,我过滤掉了NAs,因为它们没有任何意义。
此外,在pivot_longer中,我定义了我创建的新列的名称,以便更具可读性并与您的意图一致。考虑到您的输入:
df <- tibble::tribble(~title, ~actor_1_name, ~actor_2_name, ~actor_3_name, ~gross,
"A", "Christoph Waltz", "Johnny Depp", "Emma Stone", 309404152,
"B", "Mark Addy", "Christopher Lee", "Naomi Watts", 73058679 ,
"C", "Will Smith", "Tom Hanks", NA, 179020854,
"D", "Tony Curran", "Jeremy Renner", "Matt Damon", 93417865,
"E", "Chris Evans", "Eva Green", NA, 85313679)
df
#> # A tibble: 5 x 5
#> title actor_1_name actor_2_name actor_3_name gross
#> <chr> <chr> <chr> <chr> <dbl>
#> 1 A Christoph Waltz Johnny Depp Emma Stone 309404152
#> 2 B Mark Addy Christopher Lee Naomi Watts 73058679
#> 3 C Will Smith Tom Hanks NA 179020854
#> 4 D Tony Curran Jeremy Renner Matt Damon 93417865
#> 5 E Chris Evans Eva Green NA 85313679
使用匹配项可以选择所有以这种方式编写的列
使用pivot_执行的操作是重塑数据的形状,使匹配项选择的列成为一列,并对每行重复其他列的内容
标题和总额将作为每行的唯一标识符
如果需要计算每个参与者的平均毛额,可以使用:
library(tidyr)
library(dplyr)
df %>%
pivot_longer(matches("actor_\\d_name"), values_to = "actor_name") %>%
filter(!is.na(actor_name)) %>%
group_by(actor_name) %>%
summarise(mean_gross = mean(gross), .groups = "drop")
#> # A tibble: 14 x 2
#> actor_name mean_gross
#> <chr> <dbl>
#> 1 Chris Evans 85313679
#> 2 Christoph Waltz 309404152
#> 3 Christopher Lee 73058679
#> 4 Emma Stone 309404152
#> 5 Eva Green 85313679
#> 6 Jeremy Renner 93417865
#> 7 Johnny Depp 309404152
#> 8 Mark Addy 73058679
#> 9 Matt Damon 93417865
#> 10 Naomi Watts 73058679
#> 11 Tom Hanks 179020854
#> 12 Tony Curran 93417865
#> 13 Will Smith 179020854
注意,我过滤掉了NAs,因为它们没有任何意义。
此外,在pivot\u longer中,我定义了我创建的新列的名称,以便更具可读性并与您的意图保持一致。使用平均df%>%pivot\u longerstarts\u with Actor%>%SummarySeavg=meangross使用平均df%>%pivot\u longerstarts\u with Actor%>%SummarySeavg=meangross