R - 如何通过从列名称中提取项目名称来添加新列来创建新表格?

时间:2017-12-02 16:40:25

标签: r dataframe

我有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。

我在最近几个小时尝试搜索过,但我找不到任何解决办法。

2 个答案:

答案 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)