【问题标题】:Parse Column in Data Frame and Get Max Value解析数据框中的列并获取最大值
【发布时间】:2015-02-20 23:12:10
【问题描述】:

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

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

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

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

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")

任何帮助将不胜感激!

【问题讨论】:

  • 请分享dput(head(my_data, 18)),其中my_data 是您的数据框。 (如果这还不是 R 中的数据框,那么您需要告诉我们它是什么)。
  • 嘿格雷戈尔。共享 dput 的目的是什么?很长很长,我看不出它对你有什么帮助。
  • 如果您使用dput,我们可以将其复制/粘贴到 R 中并获得完全相同的数据结构,具有相同的列类和所有内容。我们将拥有您的数据对象的精确副本。然后我们调用您数据上的所有工作和测试代码。关于将您发布到 R 中的图像的唯一方法是手动输入它——即使这样也不清楚您的列是因子还是字符,是否有奇怪的编码......
  • 只发布前 20 行的输出。不能再是您发布的图片了。这些图片在构建用于测试的 R 对象时完全没有用。
  • 结构(列表(Balfour Beatty Rail (uk)-1 = c("", "22 - 4/30/2013 - 30@2.4", "17 - 5/31/2013 - 30@2.4", " 16 - 2013 年 6 月 30 日 - 30@2.4","18 - 2013 年 7 月 31 日 - 30@2.4","19 - 2013 年 8 月 31 日 - 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",

标签: r parsing vector dataframe


【解决方案1】:

首先,您需要模式匹配来提取您想要的数字,然后您需要将此模式应用于数据框的每一列。下面的代码使用正则表达式或正则表达式进行模式匹配,然后使用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)

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

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 2021-03-24
    • 2016-01-18
    • 2022-06-13
    • 2022-10-13
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多