2014-03-06 37 views
0

我得到了一個數據幀,其中「。」既用作十進制標記,也用作NA。替換「。」由NA在數據幀中「。」也用作十進制

A B C D 
1 . 1.2 6 
1 12 . 3 
2 14 1.6 4 

爲了這個數據幀上工作,我需要獲得:

A B C D 
1 NA 1.2 6 
1 12 NA 3 
2 14 1.6 4 

我應該如何處理,以保持小數,但變換單「」在C列?

這裏是一個可重複的格式的數據:

data <- structure(list(A = c(1L, 1L, 2L), B = c(".", "12", "14"), C = c("1.2", 
    ".", "1.6"), D = c(6L, 3L, 4L)), .Names = c("A", "B", "C", "D"), 
    class = "data.frame", row.names = c(NA, -3L)) 
+0

的答案是好的,但如果你可以使用'na.strings ='上游,當你使用'read.csv(「」 )'或'read.table()'來獲取數據,那會更好......(oops,現在我看到@AnandaMahto已經在他的回答中提到了這一點) –

回答

1

您可以使用type.convert並指定"."爲您na.string

df <- data ## Create a copy in case you need the original form 
df 
# A B C D 
# 1 1 . 1.2 6 
# 2 1 12 . 3 
# 3 2 14 1.6 4 

df[] <- lapply(df, function(x) type.convert(as.character(x), na.strings=".")) 
df 
# A B C D 
# 1 1 NA 1.2 6 
# 2 1 12 NA 3 
# 3 2 14 1.6 4 

注意參數是na.strings(與複數的「s」),這樣你可以指定多個字符被處理如果您有任何值,則爲NA值。

而且,實際這個問題的答案可能簡單地指定na.strings說法,當你第一次與read.tableread.csv讀你的數據轉化爲R,或許。

讓我們複製的來自R內的讀取CSV過程:

x <- tempfile() 
write.csv(data, x, row.names = FALSE) 

read.csv(x) 
# A B C D 
# 1 1 . 1.2 6 
# 2 1 12 . 3 
# 3 2 14 1.6 4 

read.csv(x, na.strings = ".") 
# A B C D 
# 1 1 NA 1.2 6 
# 2 1 12 NA 3 
# 3 2 14 1.6 4 
+0

read.table中的na.strings參數可能是最簡單/最短/最優雅的解決方案! – user2165907

2

假設你的數據幀data

data[data == "."] <- NA 

應該工作。或者:

data <- sapply(data, as.numeric) 
+0

逐列工作:data $ A [data $ A ==「。」] < - NA – user2165907