mutate replace,如何指定为字符

时间:2018-11-05 01:39:51

标签: r dplyr mutate

我具有要在“深度”列中将“ 20-Oct”替换为“ 10-20”的数据。深度是这里的一个因素。

BNPP

这是我尝试过的:

BNPP <- BNPP %>%
  mutate(depth = replace(depth, depth == "20-Oct", "10-20"))

我收到此错误消息:

Warning message:
In `[<-.factor`(`*tmp*`, list, value = "10-20") :
  invalid factor level, NA generated

因此,我尝试通过以下方法对其进行修复:

BNPP <- BNPP %>%
  BNPP$depth <- as.character(BNPP$depth) %>%
  mutate(depth = replace(depth, depth == "20-Oct", "10-20"))

然后我得到了另一个错误消息:

 Error in UseMethod("mutate_") : 
      no applicable method for 'mutate_' applied to an object of class "character"

我尝试将as.character放置在代码块之外,并且可以工作,但是我不知道为什么:

BNPP$depth <- as.character(BNPP$depth)
BNPP <- BNPP %>%
  mutate(depth = replace(depth, depth == "20-Oct", "10-20"))

对于第一个为什么不起作用但最后一个不能起作用的解释,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

这看起来像是excel自动更正问题(顺便说一句,这很有趣)。

错误消息告诉您levels(BNPP$depth)中不存在“ 10-20”,因此您不能直接将“ 20-Oct”突变为其他内容。

一个简单的解决方法是将BNPP $ depth转换为字符向量,然后对其进行突变: (在测试过程中,我发现mutate + gsub会为您完成转换)

library(dplyr)

# data
df <- data.frame(
  plot = c(1,1,1),
  subplot = c("B","B", "B"),
  depth = c("0-10","20-Oct", "20-30")
)

# mutate depth

df.new <-
  df %>%
  mutate(depth = gsub("20-Oct","10-20", depth))

df.new
#>   plot subplot depth
#> 1    1       B  0-10
#> 2    1       B 10-20
#> 3    1       B 20-30

reprex package(v0.2.1)于2018-11-05创建

答案 1 :(得分:0)

测试一下。窃取了TC Zhang的样本df,但改了名称以适合该问题。

library(hablar)
library(dplyr)

BNPP <- data.frame(
  plot = c(1,1,1),
  subplot = c("B","B", "B"),
  depth = c("0-10","20-Oct", "20-30")
)

BNPP %>% 
  convert(chr(depth)) %>% 
  mutate(depth = if_else(depth == "20-Oct", "10-20", depth))

给予

# A tibble: 3 x 3
   plot subplot depth
  <dbl> <fct>   <chr>
1     1 B       0-10 
2     1 B       10-20
3     1 B       20-30