在这种情况下如何用空格替换NA?

时间:2015-05-18 18:08:17

标签: r

我有这样的数据集:

>Mydata
 SampleID  mean      sd      
   F1      NA        NA       
   F2    215.7400 1.5881646 
   F3      NA        NA        
   F4      NA        NA        
   F5      NA        NA 

我使用以下代码来舍入数字变量'mean'和'sd':

mydata$mean<-format(round(mydata$mean,2),nsmall=2)
mydata$sd<-format(round(mydata$sd,2),nsmall=2)

它变成了这样:

>mydata
  Sample.ID  mean   sd       
      F1     NA     NA        
      F2   215.74  1.59 
      F3     NA     NA        
      F4     NA     NA     
> summary(mydata)
     mean              sd          
   Length:48          Length:48         
   Class :character   Class :character  
   Mode  :character   Mode  :character 

我想用空格替换NA,然后我尝试了几种方法,但NA还在那里......

> mydata[is.na(mydata)]<-""
>mydata
  Sample.ID  mean   sd       
      F1     NA     NA        
      F2   215.74  1.59 
      F3     NA     NA        
      F4     NA     NA 

>mydata[mydata=="NA"]<-""
>mydata
  Sample.ID  mean   sd       
      F1     NA     NA        
      F2   215.74  1.59 
      F3     NA     NA        
      F4     NA     NA 

我想这是因为这里包含“NA”的列是字符,所以我不能替换所有的NA?任何人都知道如何用空格替换字符NAs?

非常感谢!

2 个答案:

答案 0 :(得分:2)

您可以使用def addimg(request, pk): post = get_object_or_404(Post, pk=pk) if request.method == "POST": form = AddimgForm(request.POST, request.FILES, post=post) #... else: form = AddimgForm(post=post) return render(request, 'blog/edit.html', {'form': form}) class AddimgForm(forms.ModelForm): class Meta: model = Addimg fields = ('post', 'addimg', 'width', 'height',) def __init__(self, *args, **kwargs): post = kwargs.pop('post') super(AddimgForm, self ).__init__(*args, **kwargs) self.fields['post'].queryset = Post.objects.filter(id=post.id)

ifelse

或者,如果您愿意,

blank.format <- function(x) {
    ifelse(is.na(x), "", format(round(x, 2), nsmall = 2))
}

Mydata <- transform(Mydata, mean = blank.format(mean),
                            sd = blank.format(sd))

无论哪种方式,您的数据框现在都如下所示:

Mydata$mean <- ifelse(is.na(Mydata$mean), "", format(round(Mydata$mean, 2), nsmall = 2))
Mydata$sd <- ifelse(is.na(Mydata$sd), "", format(round(Mydata$sd, 2), nsmall = 2))

当值仍为数字时,此测试Mydata # SampleID mean sd # 1 F1 # 2 F2 215.74 1.59 # 3 F3 # 4 F4 # 5 F5 str(Mydata) # 'data.frame': 5 obs. of 3 variables: # $ SampleID: chr "F1" "F2" "F3" "F4" ... # $ mean : chr "" "215.74" "" "" ... # $ sd : chr "" "1.59" "" "" ... 。如果是NA,则将新变量设为空,否则按需要格式化。

答案 1 :(得分:0)

看起来NA被转换为字符串&#34; NA&#34;使用format时。因此,首先设置参数trim=TRUE以避免第一个空格(来自帮助:if trim=FALSE,逻辑,数值和复数值右对齐到公共宽度:如果为TRUE,则前导空格因为理由被压制了。 所以现在你仍然有&#34; NA&#34;字符串,所以用空格替换它们的条件应该是

mydata$mean[mydata$mean=="NA"]<-""
mydata$sd[mydata$sd=="NA"]<-""