【问题标题】:row means without taking NAs / Blanks行意味着不采取 NAs / Blanks
【发布时间】:2014-12-01 05:03:19
【问题描述】:

假设我有一个数据框

names <- c('joe','bob','john','carl')
col2 <- c(1,4,3,4)
col3 <- c(2,10,"",7)
col4 <- c(3,10,7,4)


df <- data.frame(names, col2, col3, col4)

如何让第 5 列显示准确的平均值?

df$mean <- 0

df$mean <- rowMeans(df[, c(2:4)])

...但由于 col3 的 str(df) 是一个因素,因此计算不正确 我希望 df$mean 列显示 c(2,8,5, 5) 因为第三行应该只取 3 和 7 的平均值(等于5)。我不想将“”设置为 0,因为这样第三行的平均值将是 3.333,这是不正确的。

【问题讨论】:

    标签: r dataframe mean na


    【解决方案1】:

    试试:

    df$col3<-as.numeric(as.character(df$col3))
    df$mean <- rowMeans(df[, c(2:4)],na.rm=TRUE)
    

    【讨论】:

    • 另外,将其应用于所有列的最佳方法是什么?即假设我有 100 列都需要 as.numeric(as.character(df$col"i")。你会推荐一个 for 循环吗?
    • 不,R 中的循环往往非常慢。相反,使用 sapply: df2 &lt;- sapply(df[101:200], function(x) as.numeric(as.character(x))) 其中 101 和 200 是 100 列开始和结束的索引。如果要将其应用于整个数据框,请使用:df &lt;- sapply(df, function(x) as.numeric(as.character(x)))
    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 2014-08-15
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多