我的考勤表如下
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轴,值为 - 因此为该日的名称计数。
答案 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))