我具有要在“深度”列中将“ 20-Oct”替换为“ 10-20”的数据。深度是这里的一个因素。
这是我尝试过的:
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"))
对于第一个为什么不起作用但最后一个不能起作用的解释,我将不胜感激。
答案 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