问题;分隔文件,负号是错位的,字符是数字转换强制

时间:2016-01-15 18:37:42

标签: r dataframe coercion data-cleaning

我想将数据中所有错位的-ve符号转换为前缀 - 符号并将数据转换为数字。

我有一个数据框,例如所有这些数据都是从a读取的;分隔文件,分隔错误。我需要清理这些数据并将其转换为数字类,其中4-,1-,8-变为-4,-1,-8并被视为-ve数。

我的数据框如下:

data.frame(a=c("1","1-","2","4-"),b= c("2","3-","4","5"),c=c("3-","6-","3","8"),d=c("5","9","9-","6"))

2 个答案:

答案 0 :(得分:0)

这需要为数字sub或小数点创建0-9正则表达式模式,然后在具有任意重复次数的字符类中使用减号,并使用前面的减号替换减号在传递给as.numeric之前。这没有安全测试。如果您尚未删除之前只有数据图片的问题,那么您应该返回并立即将其删除。

df1 <- data.frame(a=c("1","1-","2","4-"),
                    b= c("2","3-","4","5"),
                   c=c("3-","6-","3","8"),
                   d=c("5","9","9-","6"))
 lapply(df1, function(col) as.numeric( sub("([0-9.]+)[-]", "-\\1", col) ) )
#---- result looks OK  ---
$a
[1]  1 -1  2 -4

$b
[1]  2 -3  4  5

$c
[1] -3 -6  3  8

$d
[1]  5  9 -9  6
# --- now replace the original df1 structure with those values ---
 df1[] <- lapply(df1, function(col) as.numeric( sub("([0-9.]+)[-]", "-\\1", col) ) )
#---- check for success----
> str(df1)
'data.frame':   4 obs. of  4 variables:
 $ a: num  1 -1 2 -4
 $ b: num  2 -3 4 5
 $ c: num  -3 -6 3 8
 $ d: num  5 9 -9 6

答案 1 :(得分:0)

切换2个捕获组(数字和负号),其中df是您的data.frame,然后转换为数字:

 sapply(df,function(x){ as.numeric(sub("([0-9.]*)(-)$","\\2\\1",x)) })