Я хочу рассчитать средний возраст людей, идущих на каждый фильм, используя список - PullRequest
2 голосов
/ 23 июня 2019

Я новичок и пытаюсь подсчитать средний возраст людей, идущих на каждый фильм, используя list () и кадры данных. Я не знаю, как решить эту проблему, любая помощь будет принята с благодарностью, спасибо.

Это то, что я имею до сих пор:

fname <- c("Jake", "Anthony", "Albert", "James", "Tony")
lname <- c("Copi", "Copi", "Einstein", "Gleick", "Gleick")
age <- c(33, 40, 77, 44, 50)
movie <- c("Iron Man", "Thor", "Iron Man", "Iron Man", "Thor")
df <- data.frame(fname, lname, age, movie, stringsAsFactors = FALSE)

my.list <- list(fname, lname, age, movie)
my.list[3]

cat("\n**** Mean age ****\n")
# Calculate the mean age for people in the same movie
mean <- mean(my.list[[3]])
print(mean)

cat("\n**** People in the family by last name ****\n")
# Calculate the number of people in family with the same last name
table <- table(my.list[2])
print(table)

Output:
**** Mean age ****
[1] 48.8

**** People in the family by last name ****

    Copi Einstein   Gleick 
       2        1        2 

Ответы [ 3 ]

3 голосов
/ 23 июня 2019

Используйте aggregate. С вашим df:

aggregate(age ~ movie, data=df, mean)

     movie      age
1 Iron Man 51.33333
2     Thor 45.00000

Чтобы использовать ваш список, я бы честно просто удалил его из списка ..

unlisted_df <- data.frame(age=unlist(my.list[[3]]),movie=unlist(my.list[[4]]))
aggregate(age ~ movie, data=unlisted_df, mean)

     movie      age
1 Iron Man 51.33333
2     Thor 45.00000
0 голосов
/ 23 июня 2019

Вы также можете попробовать mean в by, выдавая такой вывод:

by(df$age, df$movie, mean)
# df$movie: Iron Man
# [1] 51.33333
# ----------------------------------------------------------------------------------- 
# df$movie: Thor
# [1] 45

, дополнительно используя with и round.

round(with(df, by(age, movie, mean)), 1)
# movie: Iron Man
# [1] 51.3
# ----------------------------------------------------------------------------------- 
# movie: Thor
# [1] 45

Данные

df <- structure(list(fname = c("Jake", "Anthony", "Albert", "James", 
"Tony"), lname = c("Copi", "Copi", "Einstein", "Gleick", "Gleick"
), age = c(33, 40, 77, 44, 50), movie = c("Iron Man", "Thor", 
"Iron Man", "Iron Man", "Thor")), class = "data.frame", row.names = c(NA, 
-5L))
0 голосов
/ 23 июня 2019

Немного другой подход без использования списка и функции агрегирования:

#Your Dataframe initialisation
fname <- c("Jake", "Anthony", "Albert", "James", "Tony")
lname <- c("Copi", "Copi", "Einstein", "Gleick", "Gleick")
age <- c(33, 40, 77, 44, 50)
movie <- c("Iron Man", "Thor", "Iron Man", "Iron Man", "Thor")
df <- data.frame(fname, lname, age, movie, stringsAsFactors = FALSE)

#Creating a list of unique movies within the dataframe
movie_list = unique(df$movie) 
counter = 1
#A Dataframe to store Movie along with the mean actor age
mean_df = data.frame(movie = character(), average_age = numeric(), stringsAsFactors = FALSE)

#Iterate over the movies
for(movie in movie_list){
    #Locate their index in the main dataframe
    movie_index = df$movie == movie
    #Calculate the mean of "age" column within the located indexes
    average = mean(df$age[movie_index])
    #Append the movie name and the corresponding avg. age to the 'mean_df'
    mean_df[counter,] = list(movie, average)
    #A variable to access the main dataframe, row by row
    counter = counter+1
} 

print(mean_df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...