在数据框中解析列并获取最大值

时间:2015-02-20 23:12:10

标签: r parsing vector dataframe

我是R的初学者,需要帮助才能在data.frame中执行以下步骤:

1)解析每列中的非空值,并且 2)将每列的解析值转换为向量

Sample Data

作为一个例子,对于A公司,我想做的是在" - "之间拉取值。和" @"对于该列中的所有非空白值(即A公司的每个非空白值为60)。然后我想创建一个包含所有值的向量,例如vector =(parseddata1,parseddata2,parseddata3等)。

对我来说最困难的部分是逐个单元格地解析每个列,并以某种方式将每列中的值转换为向量。

R对象:

  Balfour Beatty Rail (uk)-1 Balfour Beatty Rail (uk)-2
1                                                      
2    22 - 4/30/2013 - 30@2.4    27 - 4/30/2013 - 10@2.4
3    17 - 5/31/2013 - 30@2.4    18 - 5/31/2013 - 10@2.4
4    16 - 6/30/2013 - 30@2.4    17 - 6/30/2013 - 10@2.4
5    18 - 7/31/2013 - 30@2.4    19 - 7/31/2013 - 10@2.4
6    19 - 8/31/2013 - 30@2.4    39 - 8/31/2013 - 10@2.4
  Balfour Beatty Utility Solutions-1
1           17 - 3/31/2013 - 210@2.4
2           17 - 4/30/2013 - 210@2.4
3           15 - 5/31/2013 - 420@2.4
4           19 - 6/30/2013 - 420@2.4
5           16 - 7/31/2013 - 420@2.4
6           15 - 8/31/2013 - 420@2.4


dat <-     structure(list(`Balfour Beatty Rail (uk)-1` = c("", "22 - 4/30/2013 - 30@2.4", 
"17 - 5/31/2013 - 30@2.4", "16 - 6/30/2013 - 30@2.4", "18 - 7/31/2013 - 30@2.4", 
"19 - 8/31/2013 - 30@2.4"), `Balfour Beatty Rail (uk)-2` = c("", 
"27 - 4/30/2013 - 10@2.4", "18 - 5/31/2013 - 10@2.4", "17 - 6/30/2013 - 10@2.4", 
"19 - 7/31/2013 - 10@2.4", "39 - 8/31/2013 - 10@2.4"), `Balfour Beatty Utility Solutions-1` = c("17 - 3/31/2013 - 210@2.4", 
"17 - 4/30/2013 - 210@2.4", "15 - 5/31/2013 - 420@2.4", "19 - 6/30/2013 - 420@2.4", 
"16 - 7/31/2013 - 420@2.4", "15 - 8/31/2013 - 420@2.4")), .Names = c("Balfour Beatty Rail (uk)-1", 
"Balfour Beatty Rail (uk)-2", "Balfour Beatty Utility Solutions-1"
), row.names = c(NA, 6L), class = "data.frame")

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

首先,您需要模式匹配来提取所需的数字,然后您需要将此模式应用于数据框的每一列。下面的代码使用正则表达式或正则表达式进行模式匹配,然后使用sapply将该模式应用于数据的每一列。

以下是以下代码的工作原理:

1)gsub进行字符串替换。在这种情况下,我们将识别您想要的数字,返回这些数字,然后摆脱其他所有数据。

2)这是正则表达式模式:".*- ([0-9]*)@.*"。它表示查找任意字符序列.*,然后是-,后跟一个空格,后跟任意数量的数字[0-9]*,后跟@,然后是任何字符序列.*。括号([0-9]*)“捕获”内部的内容。这就是我们想要保留的。 \\1告诉gsub返回此捕获组内的内容。

3)gsub返回字符串。 as.numeric将输出转换为数字。

4)sapply在数据框dat的每一列上运行一个函数(在本例中为“匿名”函数,用于从字符数据中提取数字)。

datParsed = sapply(dat, function(col) {
  as.numeric(gsub(".* - ([0-9]*)@.*", "\\1", col))
}) 

     Balfour Beatty Rail (uk)-1 Balfour Beatty Rail (uk)-2 Balfour Beatty Utility Solutions-1
[1,]                         NA                         NA                                210
[2,]                         30                         10                                210
[3,]                         30                         10                                420
[4,]                         30                         10                                420
[5,]                         30                         10                                420
[6,]                         30                         10                                420

要将上述输出转换为单个数字向量,您只需执行as.vector(datParsed)即可。

请注意,只有当您想要的数字始终跟随-(加上空格)且始终位于@之前时,上述代码才能在整个数据框中正常运行。如果模式可以变化,或者字符串的其他部分可以匹配此模式,则需要更通用的正则表达式。