我有一个数据框,其中的值存储为字符。但是,许多值包含两个需要加在一起的数字。例如:
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
答案 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本身进行eval
和parse
计算可以解决问题。
答案 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))))