如何在矩阵/数据框中的一个单元格中保存多个数字?

时间:2014-11-25 15:13:10

标签: r matrix dataframe

这是R语言。

来自名为temp_warnings的矩阵,看起来像

    row.names  row  day   Tx     Hx      Tn
1   61         61   30   31.9   36.85   19.1
2   84         84   23   33.5   43.07   20.3
3   85         85   24   31.5   39.82   19.2
4   94         94   2    30.9   41.36   20.0
5   99         99   7    34.0   43.17   21.6
6   101       101   9    34.4   42.45   21.0
7   131       131   8    30.1   38.52   19.6
8   132       132   9    30.7   38.35   21.0

我希望使用行和日列将此信息保存到名为stn。

的新矩阵中
                             2001
Tmax >= 30 & Tmin >= 19     61, 84, 85, 94, 99, 101, 131, 132
May 
June                          30
July                        23, 24
August                      2, 7, 9
September                   8, 9

所以我希望列行的内容保存在第一个单元格中。对于Tx,Hx和Tn进行了153天的测试,5月1日 - 9月30日,因此日期列对应于该月的某天。因此,对于列行数,1-31是5月,32-61是6月,依此类推。我希望将当天的列号保存在他们这个月的正确单元格中。

如果您需要任何其他信息,请告知我们, 谢谢, 尼克

2 个答案:

答案 0 :(得分:2)

这是非常不寻常的格式,所以事情可能会变得混乱:

dat <- read.table(header = TRUE, text="row.names  row  day   Tx     Hx      Tn
1   61         61   30   31.9   36.85   19.1
2   84         84   23   33.5   43.07   20.3
3   85         85   24   31.5   39.82   19.2
4   94         94   2    30.9   41.36   20.0
5   99         99   7    34.0   43.17   21.6
6   101       101   9    34.4   42.45   21.0
7   131       131   8    30.1   38.52   19.6
8   132       132   9    30.7   38.35   21.0")


## creating a column for the months and pasting the days by month
dat <- within(dat, {
  m <- cut(row, breaks = c(0, 31, 61, 91, 121, Inf), labels = month.abb[5:9])
  ms <- ave(dat$day, m, FUN = function(x) paste(x, collapse = ', '))
#   'Tmax >= 30 & Tmin >= 19' <- paste(row, collapse = ', ')
})

## creating the final data frame to merge into
dat1 <- data.frame(' ' = c('Tmax >= 30 & Tmin >= 19', month.abb[5:9]),
                   '2001' = c(paste(dat$row, collapse = ', '), rep(NA, 5)),
                   check.names = FALSE)

dat1 <- merge(dat1, dat[!duplicated(dat[c('m','ms')]), c('m','ms')],
              by.x = ' ', by.y = 'm', all = TRUE)

## combining the two columns and some clean-up
dat1 <- within(dat1, {
  '2001' <- gsub('NA', '', paste(`2001`, ms))
  ms <- NULL
  ' ' <- factor(` `, levels = c('Tmax >= 30 & Tmin >= 19', month.abb[5:9]))
})

## and ordering the rows as desired
dat1[with(dat1, order(` `)), ]

#                                                         2001
# 6 Tmax >= 30 & Tmin >= 19 61, 84, 85, 94, 99, 101, 131, 132 
# 4                     May                                   
# 3                     Jun                                 30
# 2                     Jul                             23, 24
# 1                     Aug                            2, 7, 9
# 5                     Sep                               8, 9

答案 1 :(得分:0)

这就是我最终做的事情

stn[1,1] <- toString(temp_warnings$row)
stn[2,1] <- toString((subset(temp_warnings, row <= 31))$day)
stn[3,1] <- toString((subset(temp_warnings, 31 < row & row <= 61))$day)
stn[4,1] <- toString((subset(temp_warnings, 61 < row & row <= 92))$day)
stn[5,1] <- toString((subset(temp_warnings, 92 < row & row <= 123))$day)
stn[6,1] <- toString((subset(temp_warnings, 123 < row))$day)