2014-03-06 39 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