R - 将数据帧单元格中的数字加在一起

时间:2015-08-27 01:56:26

标签: r dataframe addition coercion

我有一个数据框,其中的值存储为字符。但是,许多值包含两个需要加在一起的数字。例如:

                    2014 Q1 Sales   2014 Q2 Sales   2014 Q3 Sales   2014 Q4 Sales 
  Product 1                  3+6            2+10               8            13+2
  Product 2                    6             4+0            <NA>               5
  Product 3                 <NA>             5+9             3+1              11

有没有办法通过整个数据框并将包含“3 + 6”等字符的所有单元格替换为等于其总和的新值?我假设这会涉及将字符强制转换为数字或整数,但我不知道如何使用带有+符号的值。我希望示例数据框最终看起来像这样:

                    2014 Q1 Sales   2014 Q2 Sales   2014 Q3 Sales   2014 Q4 Sales 
  Product 1                    9              12               8              15
  Product 2                    6               4            <NA>               5
  Product 3                 <NA>              14               4              11

2 个答案:

答案 0 :(得分:2)

这是一个更简单的例子:

dat <- data.frame(a=c("3+6", "10"), b=c("12", NA), c=c("3+4", "5+6"))
dat
##      a    b   c
##  1 3+6   12 3+4
##  2  10 <NA> 5+6

apply(dat, 1:2, function(x) eval(parse(text=x)))
##       a  b  c
## [1,]  9 12  7
## [2,] 10 NA 11

使用R本身进行evalparse计算可以解决问题。

答案 1 :(得分:1)

以下是使用gsubfn而不使用eval(parse的一个选项。我们转换了&#39; data.frame&#39;到&#39;矩阵&#39; (as.matrix(dat))。我们匹配数字([0-9]+),使用括号((..))后跟+将其捕获为一组,然后是第二组数字,并通过转换为{{1 }}然后执行numeric。可以将输出分配回原始数据集,以获得与&#39; dat&#39;中相同的结构。

+

或者我们可以使用library(gsubfn) dat[] <- as.numeric(gsubfn('([0-9]+)\\+([0-9]+)', ~as.numeric(x)+as.numeric(y), as.matrix(dat))) dat # 2014 Q1 Sales 2014 Q2 Sales 2014 Q3 Sales 2014 Q4 Sales #Product 1 9 12 8 15 #Product 2 6 4 NA 5 #Product 3 NA 14 4 11 循环列,并为每个列执行lapply替换。

gsubfn

数据

 dat[] <- lapply(dat, function(x) as.numeric(gsubfn('([0-9]+)\\+([0-9]+)', 
        ~as.numeric(x)+as.numeric(y),  as.character(x))))