我有data.frame
列名:
Machine1.workingTime, Machine2.workingTime, Machine3.workingTime,
Machine1.producedItems, Machine2.producedItems, ...
此框架可以通过更多机器的时间来扩展。 我需要制作一个R脚本,我必须得到这个解决方案:
workingTime, producedItems, MachineNum
其中MachineNum是我从中获取数据的列中的数字。(例如,如果我获得Machine2.workingTime列并添加到新创建的列" workingTime"" MachineNum&# 34;将是2
我必须遍历整个data.frame
并将列合并到新列中,这些列具有旧原始名称的部分名称(例如workingTime)
并从旧原始列名的第一部分过滤MachineNum。
我在最近几个小时尝试搜索过,但我找不到任何解决办法。
答案 0 :(得分:0)
我认为(希望)这是关于你在寻找什么。我知道我的答案并不是最简洁的,期待看到其他更清晰的答案。
Single
答案 1 :(得分:0)
以下是使用compile ('com.squareup.retrofit2:retrofit:2.1.0') {
exclude module: 'okhttp'
}
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'
库的方法。
reshape2
结果是:
machine1.workingTime <- 1:10
machine2.workingTime <- 21:30
machine1.producedItems <- 101:110
machine2.producedItems <- 201:210
date <- c("2017-01-01","2017-01-02","2017-01-03","2017-01-04","2017-01-05","2017-01-06",
"2017-01-07","2017-01-08","2017-01-09","2017-01-10")
theData <- data.frame(date,
machine1.producedItems,
machine1.workingTime,
machine2.producedItems,
machine2.workingTime
)
library(reshape2)
meltedData <- melt(theData,measure.vars=2:5)
meltedData$variable <- as.character(meltedData$variable)
# now, extract machine numbers and variable names
variableNames <- strsplit(as.character(meltedData$variable),"[.]")
# token after the . is variable name
meltedData$columnName <- unlist(lapply(variableNames,function(x) x[2]))
# since all variables start with word 'machine' we can set chars 8+ as ID
meltedData$machineId <- as.numeric(unlist(lapply(variableNames,function(x) y <- substr(x[1],8,nchar(x[1])))))
theResult <- dcast(meltedData,machineId + date ~ columnName,value.var="value")
head(theResult)
UPDATE(02Dec2017):响应评论,如果没有其他标识符可以唯一地区分机器的多个行,则可以使用聚合函数对每台机器进行一次观察。 / p>
> head(theResult)
machineId date producedItems workingTime
1 1 2017-01-01 101 1
2 1 2017-01-02 102 2
3 1 2017-01-03 103 3
4 1 2017-01-04 104 4
5 1 2017-01-05 105 5
6 1 2017-01-06 106 6
>
结果如下。
theResult <- dcast(meltedData,machineId ~ columnName,
fun.aggregate=mean,value.var="value")
head(theResult)
更新(02Dec2017):响应评论,使用唯一序列号区分数据行的解决方案如下所示。
> head(theResult)
machineId producedItems workingTime
1 1 105.5 5.5
2 2 205.5 25.5
>
...和输出。
machine1.workingTime <- 1:10
machine2.workingTime <- 21:30
machine1.producedItems <- 101:110
machine2.producedItems <- 201:210
id <- 1:length(machine1.workingTime)
theData <- data.frame(id,
machine1.producedItems,
machine1.workingTime,
machine2.producedItems,
machine2.workingTime
)
meltedData <- melt(theData,measure.vars=2:5)
head(meltedData)
meltedData$variable <- as.character(meltedData$variable)
# now, extract machine numbers and variable names
variableNames <- strsplit(as.character(meltedData$variable),"[.]")
meltedData$columnName <- unlist(lapply(variableNames,function(x) x[2]))
meltedData$machineId <- as.numeric(unlist(lapply(variableNames,function(x) y <- substr(x[1],8,nchar(x[1])))))
theResult <- dcast(meltedData,machineId + id ~ columnName,value.var="value")
head(theResult)