如何在R中动态添加行创建2D表?

时间:2016-05-14 11:42:09

标签: r

我的考勤表如下

name 23.Apr 24.Apr 25.Apr
--------------------------------
john   P     Sick   P
marry  P     P      Vacation
harry  Sick  P      GoneForSport

这里的列是日期,值是原因。 如何创建包含列的表 - 名称,日期,原因? 这里有三行和三列,新表中将有9行。 我尝试使用

rows = nrow(attData)
cols = ncol(attData)
matr <- as.data.frame(matrix(nrow=rows*(cols-1), ncol=3))
colNames = colnames(attData)
for (member in 1:rows) {
  for (dates in 2:cols) {
    matr[member,] <- c(attData[member,1], colNames[dates], attData[member,dates])
  }
}

但是这段代码没有用。

我的出勤表的主要目标是绘制图表,其中日期为x轴,原因为y轴,值为 - 因此为该日的名称计数。

2 个答案:

答案 0 :(得分:1)

您可以使用tidyr pakcage,您的转换称为将数据从wide格式转换为long格式,您可以使用gather函数。

library(tidyr)
matr <- gather(attData, date, reason, -name)

> matr
   name   date       reason
1  john 23.Apr            P
2 marry 23.Apr            P
3 harry 23.Apr         Sick
4  john 24.Apr         Sick
5 marry 24.Apr            P
6 harry 24.Apr            P
7  john 25.Apr            P
8 marry 25.Apr     Vacation
9 harry 25.Apr GoneForSport

另一种选择是使用melt包中的data.table函数:

library(data.table)
> setDT(attData)
> melt(attData, id = "name", measure = 2:4)
    name variable        value
1:  john   23.Apr            P
2: marry   23.Apr            P
3: harry   23.Apr         Sick
4:  john   24.Apr         Sick
5: marry   24.Apr            P
6: harry   24.Apr            P
7:  john   25.Apr            P
8: marry   25.Apr     Vacation
9: harry   25.Apr GoneForSport

答案 1 :(得分:0)

以下是base R选项reshape

res <- reshape(attData, idvar="name", direction="long", 
      varying = list(2:4), v.names = "reason", timevar="Date")
res$Date <- names(attData)[-1][res$Date]
row.names(res) <- NULL
res
#   name   Date       reason
#1  john 23.Apr            P
#2 marry 23.Apr            P
#3 harry 23.Apr         Sick
#4  john 24.Apr         Sick
#5 marry 24.Apr            P
#6 harry 24.Apr            P
#7  john 25.Apr            P
#8 marry 25.Apr     Vacation
#9 harry 25.Apr GoneForSport

数据

attData <- structure(list(name = c("john", "marry", "harry"), 
`23.Apr` = c("P", 
"P", "Sick"), `24.Apr` = c("Sick", "P", "P"), `25.Apr` = c("P", 
"Vacation", "GoneForSport")), .Names = c("name", "23.Apr", "24.Apr", 
"25.Apr"), class = "data.frame", row.names = c(NA, -3L))