【问题标题】:R calculates the average of two cells in a dataframe wrongR错误地计算了数据框中两个单元格的平均值
【发布时间】:2019-09-15 07:07:17
【问题描述】:

我需要计算一名工人的特定岗位和轮班前测量值的差异,并将这两个差异取平均值。一个差异是 9,另一个是 -2,但是当我使用“平均值”来计算平均值时,R 显示的是 9 而不是 4.5。我究竟做错了什么。我的代码(4和8是post,1和5是pre):

   mean((p2res$feno[p2res$no=="4"&p2res$subject.id==4])-
   (p2res$feno[p2res$no=="1"&p2res$subject.id==4])+
   (p2res$feno[p2res$no=="8"&p2res$subject.id==4])-
   (p2res$feno[p2res$no=="5"&p2res$subject.id==4])) 

    p2res <- structure(list(subject.id = c(4, 4, 4, 4, 4, 4, 4, 4, 6, 
    6, 6, 6, 6, 6, 6, 6), no = c(1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 
    5, 6, 7, 8), feno = c(24, 23, 40, 35, 28, 25, 22, 26, 19, 19, 18, 
    19, 15, 14, 29, 18)), row.names = c(NA, -16L), class = 
    c("data.frame"))

      subject.id  no  feno
               4  1   24
               4  2   23
               4  3   40
               4  4   35
               4  5   28
               4  6   25
               4  7   22
               4  8   26
               6  1   19
               6  2   19
               6  3   18
               6  4   19
               6  5   15
               6  6   14
               6  7   29
               6  8   18

另外,我怎样才能为其他测量创建一个函数呢?

【问题讨论】:

  • 你能和dput(p2res)分享你的数据吗?
  • x
  • 我不确定如何向您展示 data.frame,但这就是我从 dput() 得到的
  • @Nilou 这是数据框,现在任何人都可以将其复制/粘贴到 R 中。
  • 如果你想要 35 - 24 和 26 - 28 的平均值,那么你不应该将它们加在一起,而是需要将它们连接到一个向量中:mean(c(35 - 24, 26- 28)),或者从数据mean(c(p2res$feno[p2res$no=="4"&amp;p2res$subject.id==4] - p2res$feno[p2res$no=="1"&amp;p2res$subject.id==4], p2res$feno[p2res$no=="8"&amp;p2res$subject.id==4] - p2res$feno[p2res$no=="5"&amp;p2res$subject.id==4]))

标签: r average mean


【解决方案1】:

这是因为 R 解释的代码格式不正确,无法正确输入 mean,因为 mean 只能计算数字或逻辑向量。 你在计算之前先计算表达式计算平均值,即。您正在计算 9 的平均值,结果为 9。

此外,35-24 返回 11,而 26-28 返回 -2。也许您指的是不同的价值?所以 11 和 -2 的平均值是 4.5,所以假设你的意思是 11 而不是 9。

您可以做的(如果您不想编写函数)定义一个长度为 2 的变量。 x&lt;-c(((p2res$feno[p2res$no=="4"&amp;p2res$subject.id==4])-(p2res$feno[p2res$no=="1"&amp;p2res$subject.id==4])), ((p2res$feno[p2res$no=="8"&amp;p2res$subject.id==4])-(p2res$feno[p2res$no=="5"&amp;p2res$subject.id==4])))

那么,

mean(x)

给 4.5

【讨论】:

  • 你能帮忙写一个函数吗?
  • 我不知道这会有多大帮助...myfunction&lt;-function(x){ num&lt;- nrow(p2res) id&lt;-(p2res$feno[p2res$no=="4"&amp;p2res$subject.id==4]) id2&lt;-(p2res$feno[p2res$no=="1"&amp;p2res$subject.id==4]) id3&lt;-(p2res$feno[p2res$no=="8"&amp;p2res$subject.id==4]) id4&lt;-(p2res$feno[p2res$no=="5"&amp;p2res$subject.id==4]) num1&lt;-id-id2 num2&lt;-id3-id4 getmean&lt;-c(num1,num2) return(mean(getmean))} myfunction(x) 我不确定你在寻找什么整体模式。您是否正在寻找一个函数,该函数返回每个可能对的平均值减去所有其他可能对?
【解决方案2】:

您可以使用subset 提取subject.id 4 的数据来生成更易读、更易于使用的内容。

subj4 <- subset(p2res, subject.id==4)
mean(c(subj4$feno[4]-subj4$feno[1], subj4$feno[8]-subj4$feno[5]))

将attach 用于subj4 允许R 在不添加subj4 变量名的情况下查找变量。这进一步提高了可读性。

subj4 <- subset(p2res, subject.id==4)
attach(subj4)
mean(c(feno[4]-feno[1], feno[8]-feno[5]))

如果您愿意,请使用 detach(subj4) 撤消此操作。

【讨论】:

  • 我知道我的代码不是最复杂的,但我不知道如何让它变得更好。我确实有很多科目。这绝对有助于提高可读性。谢谢!
  • 您也可以使用dplyr 包来提取所有主题的值。 library(dplyr); p2res %&gt;% group_by(subject.id) %&gt;% summarize(mean(c(feno[4]-feno[1],feno[8]-feno[5])))。这将为您提供一个对象,其中包含 subject.id 的所有所需计算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2020-05-17
  • 2022-10-18
  • 2020-12-16
  • 1970-01-01
相关资源
最近更新 更多