R 将数据框中的星号替换为NA';s
这是我的数据帧df 我正在努力:R 将数据框中的星号替换为NA';s,r,R,这是我的数据帧df 我正在努力: df=data.frame(rbind(c(1,"*","*"),c("*",3,"*")) df2=as.data.frame(sapply(df,sub,pattern="*",replacement="NA")) 因为星号的原因,它不起作用,但我正在为替换它而生气。你应该举一个完整的可复制的例子,当你让他们变得容易时,人们会更倾向于帮助他们。任何人 dat <- data.frame(a=c(1,2,'*',3,4), b=c('*',2,3,4,
df=data.frame(rbind(c(1,"*","*"),c("*",3,"*"))
df2=as.data.frame(sapply(df,sub,pattern="*",replacement="NA"))
因为星号的原因,它不起作用,但我正在为替换它而生气。你应该举一个完整的可复制的例子,当你让他们变得容易时,人们会更倾向于帮助他们。任何人
dat <- data.frame(a=c(1,2,'*',3,4), b=c('*',2,3,4,'*'))
> dat
a b
1 1 *
2 2 2
3 * 3
4 3 4
5 4 *
> as.data.frame(sapply(dat,sub,pattern='\\*',replacement=NA))
a b
1 1 <NA>
2 2 2
3 <NA> 3
4 3 4
5 4 <NA>
dat-dat
a b
1 1 *
2 2 2
3 * 3
4 3 4
5 4 *
>as.data.frame(sapply(dat,sub,pattern='\\\*',replacement=NA))
a b
1 1
2 2 2
3 3
4 3 4
5 4
你应该举一个完整的可复制的例子,当你让他们变得容易时,人们会更倾向于帮助他们。任何人
dat <- data.frame(a=c(1,2,'*',3,4), b=c('*',2,3,4,'*'))
> dat
a b
1 1 *
2 2 2
3 * 3
4 3 4
5 4 *
> as.data.frame(sapply(dat,sub,pattern='\\*',replacement=NA))
a b
1 1 <NA>
2 2 2
3 <NA> 3
4 3 4
5 4 <NA>
dat-dat
a b
1 1 *
2 2 2
3 * 3
4 3 4
5 4 *
>as.data.frame(sapply(dat,sub,pattern='\\\*',replacement=NA))
a b
1 1
2 2 2
3 3
4 3 4
5 4
如果您的数据帧中有*
(意思是它不像ab*de
),那么,您可以在不使用正则表达式的情况下执行此操作:
df[df == "*"] <- NA
df[df==“*”]如果您的data.frame中有*
(意思是它不像ab*de
),那么,您可以在不使用regex
的情况下执行此操作:
df[df == "*"] <- NA
df[df==“*”]这里的两种解决方案都解决了您工作场所中已经存在的对象。如果可能(或者至少将来),您可以使用read.table
中的na.strings
参数。请注意,它是复数“字符串”,因此您应该能够指定多个字符作为NA
值处理
下面是一个例子:它只是将一个名为“readmein.txt”的文件写入当前的工作目录,并验证它是否存在
cat("V1 V2 V3 V4 V5 V6 V7\n
2 * * * * * 2\n
1 2 * * * * 1\n", file = "readmein.txt")
list.files(pattern = "readme")
# [1] "readmein.txt"
下面是read.table
,其中na.strings
参数起作用
read.table("readmein.txt", na.strings="*", header = TRUE)
# V1 V2 V3 V4 V5 V6 V7
# 1 2 NA NA NA NA NA 2
# 2 1 2 NA NA NA NA 1
更新:工作区中已存在对象
我看到了另外两个答案的另一个问题:它们都会导致字符(或者更确切地说是因子)变量,即使列可能是数字
这里有一个例子。首先,我们创建一个示例数据集。为了好玩,我添加了另一个字符作为NA
:“
这里有一个解决方法:
temp2 <- read.table(text = capture.output(temp), na.strings = c("*", "."))
temp2
# V1 V2 V3 V4
# 1 1 1 a NA
# 2 2 NA <NA> NA
# 3 3 3 c 3
str(temp2)
# 'data.frame': 3 obs. of 4 variables:
# $ V1: int 1 2 3
# $ V2: int 1 NA 3
# $ V3: Factor w/ 2 levels "a","c": 1 NA 2
# $ V4: int NA NA 3
这里的两种解决方案都解决了工作场所中已有的对象。如果可能(或者至少将来),您可以使用read.table
中的na.strings
参数。请注意,它是复数“字符串”,因此您应该能够指定多个字符作为NA
值处理
下面是一个例子:它只是将一个名为“readmein.txt”的文件写入当前的工作目录,并验证它是否存在
cat("V1 V2 V3 V4 V5 V6 V7\n
2 * * * * * 2\n
1 2 * * * * 1\n", file = "readmein.txt")
list.files(pattern = "readme")
# [1] "readmein.txt"
下面是read.table
,其中na.strings
参数起作用
read.table("readmein.txt", na.strings="*", header = TRUE)
# V1 V2 V3 V4 V5 V6 V7
# 1 2 NA NA NA NA NA 2
# 2 1 2 NA NA NA NA 1
更新:工作区中已存在对象
我看到了另外两个答案的另一个问题:它们都会导致字符(或者更确切地说是因子)变量,即使列可能是数字
这里有一个例子。首先,我们创建一个示例数据集。为了好玩,我添加了另一个字符作为NA
:“
这里有一个解决方法:
temp2 <- read.table(text = capture.output(temp), na.strings = c("*", "."))
temp2
# V1 V2 V3 V4
# 1 1 1 a NA
# 2 2 NA <NA> NA
# 3 3 3 c 3
str(temp2)
# 'data.frame': 3 obs. of 4 variables:
# $ V1: int 1 2 3
# $ V2: int 1 NA 3
# $ V3: Factor w/ 2 levels "a","c": 1 NA 2
# $ V4: int NA NA 3
这可能会奏效(这是一个非常灵活的解决方案),但已经有了其他很好的解决方案。Arun的解决方案是我的典型方法,但是为新的R(很少使用命令行)用户创建了replacer
。我不建议任何有一点经验的人使用replacer
library(qdap)
replacer(dat, "*", NA)
这可能会奏效(这是一个非常灵活的解决方案),但已经有了其他很好的解决方案。Arun的解决方案是我的典型方法,但是为新的R(很少使用命令行)用户创建了replacer
。我不建议任何有一点经验的人使用replacer
library(qdap)
replacer(dat, "*", NA)
双反斜杠是逃离星号等特殊字符的秘密,请看这里:@Ben感谢我注意到了这个双反斜杠是逃离星号等特殊字符的秘密,请看这里:@Ben感谢我注意到了这个Cheers Arun,没有足够的时间把帖子放在一起:/1个月内有双胞胎在路上,这样对hahacheers Arun没有帮助,没有足够的时间把帖子放在一起:/1个月内有双胞胎在路上,这样对hahaUsing没有帮助(更新2),根据行中包含的其他条目,我得到NA
或
,例如V1=c(1,“*”,“1”)
与V1=c(1,“*”,“a”)
。。。因此,对于您的temp data.frame,我得到了2 NA
@PatrickT,我不确定我是否理解您的评论。我试图在这个答案中指出的一点是,在确定如何处理缺失值时,通常应分别对待每一列。你能详细说明你的评论吗?对不起,我误解了。谢谢使用最后一种方法(更新2),根据行中包含的其他条目,我得到NA
或
,例如V1=c(1,“*”,“1”)
与V1=c(1,“*”,“a”)
。。。因此,对于您的temp data.frame,我得到了2 NA
@PatrickT,我不确定我是否理解您的评论。我试图在这个答案中指出的一点是,在确定如何处理缺失值时,通常应分别对待每一列。你能详细说明你的评论吗?对不起,我误解了。谢谢