R:斜率从复杂数字/字符串混合数据集中的字符串数据的多个变量中提取数字

时间:2014-10-08 14:48:33

标签: r string numeric substr gsub

我有来自德国经济专家组(SOEP)的18个类似的数据框(每个代表一个调查年),该数据框是部分字符串和部分数字。变量(每个DF中超过200个)具有以下值

  • 前4个是人和家庭的数字标识符
  • 有些是数字" -2"直到" 12"
  • 一些字符串类型1为" [1] Ja"或" [ - 2] Nein"
  • 有些是字符串类型2为" [1] Jan Vollzeit erwerbst。"或" [ - 2] trifft nicht zu"

我已经尝试了sapply - 命令,但是我收到的矩阵可以转换为没有4个标识符变量的数据帧,并且仍然有我的数字括号(PKAL06是我的起始DF)。

PKs <- sapply(PKAL06[5:225], function(PKAL06) substr (PKAL06,1,3)) 
PKsD <- data.frame(PKs)

我也试过与gsub的组合,但它只给了我NA而不是字符串。

PKas <- sapply(PKAL06, 
   function(PKAL06) as.numeric(gsub("([0-9]+).*$", "\\1", PKAL06)))

理想情况下,有人可以告诉我如何通过提取括号之间的内容来告诉R将整个(!)数据框的字符串变量更改为数字变量。输出应该是相同结构的数据框,所有变量都与之前一样,不是矩阵,不是列表。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

我从SOEP website收集数据是保密的,所以试试这个:

PKas <- sapply(PKAL06, 
   function(PKAL06) as.numeric(gsub("\\[([0-9|\\-]+)\\].+","\\1", PKAL06)))

上面的模式似乎适用于您的示例数据。

str <- c("[1] Ja","[-2] Nein")
as.numeric(gsub("\\[([0-9|\\-]+)\\].+","\\1",str))
# [1]  1 -2

str <- c("[1] Jan Vollzeit erwerbst.","[-2] trifft nicht zu")
as.numeric(gsub("\\[([0-9|\\-]+)\\].+","\\1",str))
# [1]  1 -2

你(似乎......)想要提取括号之间的任何内容。但[是正则表达式语法中的特殊字符,因此您必须使用\\[\\]来转义它。上面的代码更接近于只接受数字或括号之间的-