用选择的值替换数据框中的N / A

时间:2019-07-20 12:06:19

标签: r

我一直在尝试用我选择的值替换数据框中的N / A项,但没有成功。我检查了源并尝试了下面的代码。有人能指出为什么我的命令不起作用,尽管有一些消息表明它们应该这样做?

下面的数据帧示例DF在“ zacko”列下包含一些N / A条目:

> exampleDF
             dates random letters action    zacko
1  2018-10-30 00:05:19     10       a     go   Mickey
2  2018-10-30 13:58:39      2       b    run   Donald
3  2018-10-31 03:51:59      1       c    fly     <NA>
4  2018-10-31 17:45:19     10       d    sit    Goofy
5  2018-11-01 07:38:39     10       e   jump    Daisy
6  2018-11-01 21:31:59     13       f   hike     <NA>
7  2018-11-02 11:25:19      6       g  dance     <NA>
8  2018-11-03 01:18:39      6       h     go Dagobert
9  2018-11-03 15:11:59      8       i  dance     <NA>
10 2018-11-04 05:05:19      6       j    run    Pluto
11 2018-11-04 18:58:39      2       k    sit     <NA>
12 2018-11-05 08:51:59      6       l  laugh   Minnie
13 2018-11-05 22:45:19      3       m    cry   Gustav
14 2018-11-06 12:38:39     11       n  write Reginald
15 2018-11-07 02:31:59      1       o    fly     <NA>

我查看了Correct syntax for mutate_if,并尝试按照我的选择用相应的值替换这些条目

exampleDF %>% mutate_if(is.character, funs(ifelse(is.na(.), 
"REPLACEMENT",.)))
        Warning message:
funs() is soft deprecated as of dplyr 0.8.0
please use list() instead
        # Before:
funs(name = f(.)
        # After: 
list(name = ~f(.))

> exampleDF %>% mutate_if(is.character, list(ifelse(is.na(.), 
"REPLACEMENT",.)))
Error: Can't create call to non-callable object
Call `rlang::last_error()` to see a backtrace

没有成功(如从错误消息中可以看到的)。有趣的是,下面的命令在控制台上像超级按钮一样工作:

> df <- tibble(x = c(1, 2, NA), y = c("a", NA, "b"), z = list(1:5, NULL, 
10:20))
> df
# A tibble: 3 x 3
      x y     z         
  <dbl> <chr> <list>    
1     1 a     <int [5]> 
2     2 NA    <NULL>    
3    NA b     <int [11]>
> df %>% replace_na(list(x = 0, y = "unknown"))
# A tibble: 3 x 3
      x y       z         
  <dbl> <chr>   <list>    
1     1 a       <int [5]> 
2     2 unknown <NULL>    
3     0 b       <int [11]>

> df %>% mutate(x = replace_na(x, 0))
# A tibble: 3 x 3
      x y     z         
  <dbl> <chr> <list>    
1     1 a     <int [5]> 
2     2 NA    <NULL>    
3     0 b     <int [11]>

为什么等效命令对我的数据框不起作用?查看以下错误消息:

exampleDF %>% replace_na(list(dates = as.POSIXct("2018-10-30 13:58:39"), 
random = 5, letters = "a", action = "crying", zacko = "FRUSTRATION"))
                 dates random letters action    zacko
1  2018-10-30 00:05:19     10       a     go   Mickey
2  2018-10-30 13:58:39      2       b    run   Donald
3  2018-10-31 03:51:59      1       c    fly     <NA>
4  2018-10-31 17:45:19     10       d    sit    Goofy
5  2018-11-01 07:38:39     10       e   jump    Daisy
6  2018-11-01 21:31:59     13       f   hike     <NA>
7  2018-11-02 11:25:19      6       g  dance     <NA>
8  2018-11-03 01:18:39      6       h     go Dagobert
9  2018-11-03 15:11:59      8       i  dance     <NA>
10 2018-11-04 05:05:19      6       j    run    Pluto
11 2018-11-04 18:58:39      2       k    sit     <NA>
12 2018-11-05 08:51:59      6       l  laugh   Minnie
13 2018-11-05 22:45:19      3       m    cry   Gustav
14 2018-11-06 12:38:39     11       n  write Reginald
15 2018-11-07 02:31:59      1       o    fly     <NA>
Warning messages:
1: In `[<-.factor`(`*tmp*`, !is_complete(data[[var]]), value = "crying") :
  invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, !is_complete(data[[var]]), value = 
"FRUSTRATION") :
  invalid factor level, NA generated


> exampleDF %>% mutate(zacko = replace_na(zacko, "GAGA"))
                 dates random letters action    zacko
1  2018-10-30 00:05:19     10       a     go   Mickey
2  2018-10-30 13:58:39      2       b    run   Donald
3  2018-10-31 03:51:59      1       c    fly     <NA>
4  2018-10-31 17:45:19     10       d    sit    Goofy
5  2018-11-01 07:38:39     10       e   jump    Daisy
6  2018-11-01 21:31:59     13       f   hike     <NA>
7  2018-11-02 11:25:19      6       g  dance     <NA>
8  2018-11-03 01:18:39      6       h     go Dagobert
9  2018-11-03 15:11:59      8       i  dance     <NA>
10 2018-11-04 05:05:19      6       j    run    Pluto
11 2018-11-04 18:58:39      2       k    sit     <NA>
12 2018-11-05 08:51:59      6       l  laugh   Minnie
13 2018-11-05 22:45:19      3       m    cry   Gustav
14 2018-11-06 12:38:39     11       n  write Reginald
15 2018-11-07 02:31:59      1       o    fly     <NA>
Warning message:
In `[<-.factor`(`*tmp*`, !is_complete(data), value = "GAGA") :
  invalid factor level, NA generated

我希望上面的代码能够正常工作,如Correct syntax for mutate_if上给出的示例以及replace_na(data,replace,...)在帮助文件下给出的示例(需要tidyr程序包)。

2 个答案:

答案 0 :(得分:2)

实际上,您的问题不是由于无法正常工作而引起的,而是由于zacko是一个因素。

关于您的第一次尝试:尽管有警告,该尝试仍可正常进行,并用“ REPLACEMENT”代替NA(但请参阅下面有关因素的说明!)。新语法略有不同,要使用list而不是funs,必须像这样使用代字号:

exampleDF %>% mutate_if(is.character, list(~ ifelse(is.na(.), "REPLACEMENT", .)))

如果zacko是一个字符向量,则另一个也可以工作。。。显然(我不确定,因为您选择不使用dput来提供示例数据)exampleDF$zacko是一个因素。如果您尝试在因子中输入一个值(如果该值不是级别之一),则会出现此错误:

> x <- factor(c("a", "b", "c"))
> x[1] <- "REPLACEMENT"
Warning message:
In `[<-.factor`(`*tmp*`, 1, value = "REPLACEMENT") :
  invalid factor level, NA generated
> x
[1] <NA> b    c   
Levels: a b c

因此,您做了替换了它,但是由于它是一个因素,并且REPLACEMENT不是其中一个级别,因此再次被{{1}替换为 。试试这个:

NA

您的代码现在应该可以正常工作了。或者,如果您希望将其作为一个因素,请将“ FRUSTRATION”添加到exampleDF$zacko <- as.character(exampleDF$zacko) 的级别:

zacko

还请注意,默认情况下,levels(exampleDF$zacko) <- c(levels(exampleDF$zacko), "FRUSTRATION") 将字符向量转换为因子:

data.frame

这是非常烦人和危险的行为。你不要那个!这就是为什么许多R用户在其配置文件中设置以下内容的原因:

> foo <- data.frame(zacko=letters[1:5])
> foo$zacko
[1] a b c d e
Levels: a b c d e

tibble或数据表的行为不像这样:

options(stringsAsFactors=FALSE)

最后,在这种简单情况下,我可能只会使用良好的旧基础R:

> foo <- tibble(zacko=letters[1:5])
> foo$zacko
[1] "a" "b" "c" "d" "e"

答案 1 :(得分:0)

我尝试避免因素,并使用fade_time * 1000 // 255)来做到这一点。首先,我将fade_time = 3 # 3 seconds for i in range(255): fadeout() pygame.time.delay(fade_time * 1000 // 255) # milliseconds / 255 pygame.display.update() pygame.event.poll() 从因数转换为字符。

代码

if_na()

结果

zacko

数据

library(hablar)

df %>% 
  convert(chr(zacko)) %>% 
  mutate_if(is.character, ~if_na(., "REPLACEMENT"))