2016-04-06 31 views
0

我有一本书上显示的统计数据(用R)以下:如何在列的子集中最有效地将0 val设置为NA?

> pima$diastolic [pima$diastolic = = 0] <- NA 
> pima$glucose [pima$glucose == 0] <- NA 
> pima$triceps [pima$triceps == 0] <- NA 
> pima$insulin [pima$insulin == 0] <- NA 
> pima$bmi [pima$bmi == 0] <- NA 

有没有办法做到这一点的一条线或更有效?我看到有这样的功能,例如与,应用,子集做类似的东西,但无法弄清楚如何把它们放在一起...

示例数据(如何读取它作为数据框(如pythons stringio) :

pregnant glucose diastolic triceps insulin bmi diabetes age  test 
1  6  148  72  35  0 33.6 0.627 50 positive 
2  1  85  66  29  0 26.6 0.351 31 negative 
3  8  183  64  0  0 23.3 0.672 32 positive 
4  1  89  66  23  94 28.1 0.167 21 negative 
5  0  137  40  35  168 43.1 2.288 33 positive 
6  5  116  74  0  0 25.6 0.201 30 negative 
+0

你能为我们提供一些示例数据? –

+0

如果你想用'NA'替换数据帧中的所有'0',你可以很容易地做到:'df [df == 0] < - NA' – DatamineR

+0

或'is.na(df)< - df == 0' –

回答

7

事情是这样的:

  • 使用lapply()使用功能,每列
  • 在功能方面,测试如果列数字。如果数字,然后用NA取代零,否则返回原始列,不变:

试试这个:使用

pima[] <- lapply(pima, function(x){ if(is.numeric(x)) x[x==0] <- NA else x}) 

或为预定义栏

cols = c("diastolic", "glucose", "triceps", "insulin", "bmi") 
pima[cols] <- lapply(pima[cols], function(x) {x[x==0] <- NA ; x}) 

或者is.na<-

is.na(pima[cols]) <- pima[cols] == 0 
+0

这可能会返回一个列表而不是'data.frame'。你可能需要'pima [] <-...'。 “lapply”可能根本就没有必要(除非你试图避免矩阵转换)。 –

+0

@DavidArenburg你对'pima [] <-'是正确的。我编辑了我的答案,谢谢。你可能对不需要'lapply()'也是正确的,但是生命太短而不能记住你可以直接在数据框上使用的每种可能的方法。我知道'lapply()'适用于这种类型的问题,所以我倾向于在我自己的工作中以这种方式使用它... – Andrie

+0

虽然这不是列的子集,但它们都是afaics ... –

0

使用dplyr,你可以这样做:

# banal function definition 
zero_to_NA <- function(col) { 
    # any code that works here 
    # I chose this because it is concise and efficient 
    `is.na<-`(col, col==0) 
} 

# Assuming you want to change 0 to NA only in these 3 columns 
pima <- pima %>% 
    mutate_each(funs(zero_to_NA), diastolic, glucose, triceps) 

或者你可以跳过函数定义并直接写入:

pima <- pima %>% 
    mutate_each(funs(`is.na<-`(., .==0)), 
       diastolic, glucose, triceps) 
相关问题