R和循环跨列

时间:2013-03-12 23:05:55

标签: r

我有“Sec1OSp”,看起来像这样:

TIMEBLOCK   ep.HRC_E    ep.HRC_D    ep.HRCcm_E  ep.HRCcm_D
   1           NA          NA          NA          NA
   2           NA          NA          NA          NA
   3           NA          NA          NA          NA
   4           NA          NA          NA          NA
   5           NA          NA          NA          NA
   6           NA          5           5           5
   7           NA          5           10          5
   8           NA          5           20          5
   9           NA          5           20          5 
   10          NA          10          20          10
   11          20          10          20          10
   12          20          10          20          10
   13          20          NA          20          10
   14          20          NA          20          10
   15          10          NA          10          10
   16          10          NA          10          5
   17          NA          NA          NA          NA
   18          NA          NA          NA          NA
   19          NA          NA          NA          NA
   20          NA          NA          NA          NA
   21          NA          NA          NA          NA
   22          NA          NA          NA          NA
   23          NA          NA          NA          NA
   24          NA          NA          NA          NA

我有“data.EP.S1p”,看起来像这样:

TIMEBLOCK   ep.HRC_E    ep.HRC_D    ep.HRCcm_E  ep.HRCcm_D
   1           NA          NA          NA          NA
   2           NA          NA          NA          NA
   3           NA          NA          NA          NA
   4           NA          NA          NA          NA
   5           NA          NA          NA          NA
   6           NA          NA          NA          NA
   7           NA          NA          NA          NA
   8           NA          NA          NA          NA
   9           NA          NA          NA          NA
   10          NA          NA          NA          NA
   11          20          NA          NA          NA
   12          20          NA          NA          NA
   13          20          NA          NA          NA
   14          20          NA          NA          NA
   15          10          NA          NA          NA
   16          10          NA          NA          NA
   17          NA          NA          NA          NA
   18          NA          NA          NA          NA
   19          NA          NA          NA          NA
   20          NA          NA          NA          NA
   21          NA          NA          NA          NA
   22          NA          NA          NA          NA
   23          NA          NA          NA          NA
   24          NA          NA          NA          NA

此代码(如下)目前使用Sec1OSp $ ep.HRC_E中的数据填充数据.EP.S1p $ ep.HRC_E。

  for(t in 1:24) {
    Sec1OSpt <- subset(Sec1OSp, TIMEBLOCK==t)
    Sec1OSptnonNArows <- Sec1OSpt[!is.na(Sec1OSpt$ep.HRC_E),]
    if(nrow(Sec1OSptnonNArows) > 0) {
      if(sum(Sec1OSptnonNArows$ep.HRC_E, na.rm=TRUE) > 0) {
        data.EP.S1p$ep.HRC_E[t] <- (sum(Sec1OSptnonNArows$ep.HRC_E, na.rm=TRUE)) / nrow(Sec1OSptnonNArows)
      }
      else {
        data.EP.S1p$ep.HRC_E[t] <- NA
      }
    }

我希望能够循环此代码,以便将其应用于所有4列,从而使用Sec1OSp中的4列填充data.EP.S1p中的4列 有没有人有我的解决方案? 感谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您首先会为TIMEBLOCK的每个值找到4列的平均值。您可以使用aggregate功能执行此操作。之后,您可以使用data.EP.S1p

merge中填写这些值
Sec1OSp <- read.table(textConnection("TIMEBLOCK   ep.HRC_E    ep.HRC_D    ep.HRCcm_E  ep.HRCcm_D\n1           NA          NA          NA          NA\n2           NA          NA          NA          NA\n3           NA          NA          NA          NA\n4           NA          NA          NA          NA\n5           NA          NA          NA          NA\n6           NA          5           5           5\n7           NA          5           10          5\n8           NA          5           20          5\n9           NA          5           20          5\n10          NA          10          20          10\n11          20          10          20          10\n12          20          10          20          10\n13          20          NA          20          10\n14          20          NA          20          10\n15          10          NA          10          10\n16          10          NA          10          5\n17          NA          NA          NA          NA\n18          NA          NA          NA          NA\n19          NA          NA          NA          NA\n20          NA          NA          NA          NA\n21          NA          NA          NA          NA\n22          NA          NA          NA          NA\n23          NA          NA          NA          NA\n24          NA          NA          NA          NA"), 
    header = TRUE)

data.EP.S1p <- read.table(textConnection("TIMEBLOCK   ep.HRC_E    ep.HRC_D    ep.HRCcm_E  ep.HRCcm_D\n1           NA          NA          NA          NA\n2           NA          NA          NA          NA\n3           NA          NA          NA          NA\n4           NA          NA          NA          NA\n5           NA          NA          NA          NA\n6           NA          NA          NA          NA\n7           NA          NA          NA          NA\n8           NA          NA          NA          NA\n9           NA          NA          NA          NA\n10          NA          NA          NA          NA\n11          20          NA          NA          NA\n12          20          NA          NA          NA\n13          20          NA          NA          NA\n14          20          NA          NA          NA\n15          10          NA          NA          NA\n16          10          NA          NA          NA\n17          NA          NA          NA          NA\n18          NA          NA          NA          NA\n19          NA          NA          NA          NA\n20          NA          NA          NA          NA\n21          NA          NA          NA          NA\n22          NA          NA          NA          NA\n23          NA          NA          NA          NA\n24          NA          NA          NA          NA"), 
    header = TRUE)


avgdata <- aggregate(Sec1OSp[, 2:5], by = list(Sec1OSp$TIMEBLOCK), FUN = function(x) mean(x, na.rm = TRUE))
names(avgdata)[1] <- "TIMEBLOCK"
avgdata
##    TIMEBLOCK ep.HRC_E ep.HRC_D ep.HRCcm_E ep.HRCcm_D
## 1          1      NaN      NaN        NaN        NaN
## 2          2      NaN      NaN        NaN        NaN
## 3          3      NaN      NaN        NaN        NaN
## 4          4      NaN      NaN        NaN        NaN
## 5          5      NaN      NaN        NaN        NaN
## 6          6      NaN        5          5          5
## 7          7      NaN        5         10          5
## 8          8      NaN        5         20          5
## 9          9      NaN        5         20          5
## 10        10      NaN       10         20         10
## 11        11       20       10         20         10
## 12        12       20       10         20         10
## 13        13       20      NaN         20         10
## 14        14       20      NaN         20         10
## 15        15       10      NaN         10         10
## 16        16       10      NaN         10          5
## 17        17      NaN      NaN        NaN        NaN
## 18        18      NaN      NaN        NaN        NaN
## 19        19      NaN      NaN        NaN        NaN
## 20        20      NaN      NaN        NaN        NaN
## 21        21      NaN      NaN        NaN        NaN
## 22        22      NaN      NaN        NaN        NaN
## 23        23      NaN      NaN        NaN        NaN
## 24        24      NaN      NaN        NaN        NaN

data.EP.S1p <- merge(data.EP.S1p[, "TIMEBLOCK", drop = FALSE], avgdata, all.x = TRUE)
data.EP.S1p
##    TIMEBLOCK ep.HRC_E ep.HRC_D ep.HRCcm_E ep.HRCcm_D
## 1          1      NaN      NaN        NaN        NaN
## 2          2      NaN      NaN        NaN        NaN
## 3          3      NaN      NaN        NaN        NaN
## 4          4      NaN      NaN        NaN        NaN
## 5          5      NaN      NaN        NaN        NaN
## 6          6      NaN        5          5          5
## 7          7      NaN        5         10          5
## 8          8      NaN        5         20          5
## 9          9      NaN        5         20          5
## 10        10      NaN       10         20         10
## 11        11       20       10         20         10
## 12        12       20       10         20         10
## 13        13       20      NaN         20         10
## 14        14       20      NaN         20         10
## 15        15       10      NaN         10         10
## 16        16       10      NaN         10          5
## 17        17      NaN      NaN        NaN        NaN
## 18        18      NaN      NaN        NaN        NaN
## 19        19      NaN      NaN        NaN        NaN
## 20        20      NaN      NaN        NaN        NaN
## 21        21      NaN      NaN        NaN        NaN
## 22        22      NaN      NaN        NaN        NaN
## 23        23      NaN      NaN        NaN        NaN
## 24        24      NaN      NaN        NaN        NaN