2014-04-22 66 views
0

我想限制導入數據幀時的小數位數。我的.txt輸入在列表「Value」中的每一行都有16位小數。在相同的列中,它可以同時具有數字和字符串。我的數據框的樣子說:使用字符串限制數據幀中的小數位數(R)

Value 

0.202021561664556 
0.202021561664556 
0.202021561664556 
0.202021561664556 
NC 
... 

我的預期數據幀

Value 
0.20202156 
0.20202156 
0.20202156 
0.20202156 
NC 
... 

實際輸入(DF),不是作品:

DF <- "NE001358.Log.R.Ratio 
    -0.0970369274475688 
    0.131893549586039 
    0.0629266495860389 
    0.299559132381831 
    -0.0128804337656807 
    0.0639743960526874 
    0.0271669351886552 
    0.322395363972391 
    0.179591292893632 
      NC" 

DF <- read.table(text=DF, header = TRUE) 
+0

對於你的例子,假設'NC'意味着'NA'(未計算/不可用),也許是:函數read.table'(文= DF,標題= TRUE,colClasses =「數字」,na.strings =「NC」)' – lukeA

回答

1

您可以使用substring的特徵向量要降價。這裏我們只取這個字符串中的前十個字符。

> DF 
##    Value 
## 1 0.202021561664556 
## 2 0.202021561664556 
## 3 0.202021561664556 
## 4 0.202021561664556 
## 5    NC 

> DF$Value <- substring(DF$Value, 1, 10) 
> DF 
##  Value 
## 1 0.20202156 
## 2 0.20202156 
## 3 0.20202156 
## 4 0.20202156 
## 5   NC 

但是,由於這些是對數比,它們應該是數字。在您的文章底部的DF數據中,您可以將substring換算爲as.numericNA值將替換「NC」條目。

> DF[,1] <- as.numeric(substring(DF[,1], 1, 10)) 
1

您可以as.numericformat做到這一點:

num <- as.numeric(as.character(DF[,1])) 
ifelse(is.na(num), DF[,1], format(num, nsmall=8)) 
# [1] "-0.09703693" " 0.13189355" " 0.06292665" " 0.29955913" "-0.01288043" " 0.06397440" " 0.02716694" 
# [8] " 0.32239536" " 0.17959129" "NC" 

如果你想在小數點後限制顯著的數字,而不是數字,你應該使用digits選項,而不是nsmall。如果您不喜歡數字開頭的前導空格,請使用trim=TRUE

1

如何:

DF$NE001358.Log.R.Ratio <- as.character(DF$NE001358.Log.R.Ratio) 
DFn <- suppressWarnings(as.numeric(DF[,1])) 
DF[!is.na(DFn),] <- format(DFn,nsmall=8)[!is.na(DFn)] 
DF