【问题标题】:Add new columns with row elements in R在 R 中添加带有行元素的新列
【发布时间】:2014-12-06 17:30:56
【问题描述】:

我有一个评分和用户表。 我想在名为“AvRating”的用户表中添加一个新列 对于该列的每一行,我想要每个用户给出的平均评分。 我遍历 Ratings 表中的所有用户 ID,并获得所有相应评级的平均值。 但是,“AvRating”列包含一堆 N/A,仅此而已。

Ratings = read.table("Ratings.txt", 
               sep="\t", 
               col.names=c("ID", "MId", "Rating"), 
               fill=FALSE, 
               strip.white=TRUE)    


Users = read.table("Users.txt", 
               sep="\t", 
               col.names=c("ID", "Age", "Gender", "Occupation", "ZIP"), 
               fill=FALSE, 
               strip.white=TRUE) 


Users["AvRating"] <- NA   


for(i in 1:943){    # 943 rows in "Ratings" table

    N = 0
    x = i

    # Counting number of ratings by specific User

    while(Ratings[1, i]==x){

        N=N+1

    }

    x = i

    temp = rep(0, N)

    for(j in 0:N){

        temp[j] = Ratings[3, i] 

    }

    t = mean(temp)


    Users[6][i] = t

}  

Users[6]               

【问题讨论】:

  • 你试过?rowMeans吗?
  • rowMeans 或 colMeans 不起作用,因为我没有计算整个列,我正在计算由 ID 1、ID 2、ID 3 等做出的任何评级的平均值。
  • 基本方法是使用ave
  • 只需子集您正在使用的列并将其传递给rowMeans?
  • 你能告诉我这是如何在我的问题的上下文中完成的吗?

标签: r rows multiple-columns


【解决方案1】:

使用 R,您几乎不需要 for 循环。使用dplyr

# first load data and dplyr   
library(dplyr)
user.ave.rating <- Ratings %>% 
    group_by(ID) %>%
    summarize(AvRating = mean(Rating, na.rm = TRUE))
# Join this to your user table
Users <- left_join(Users, user.ave.rating)

在基础 R 中也很容易,但我发现聚合的语法更难理解/记住:

user.ave.rating <- aggregate(Rating ~ ID, FUN = mean, data = Ratings, na.rm = TRUE)
names(user.ave.rating)[2] <- "AvRating"
Users <- merge(Users, user.ave.rating, by = "ID")

【讨论】:

    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多