如何基于grep覆盖R中的变量

时间:2018-12-16 17:24:28

标签: r dataframe

我有一个简单的数据框:

> var_body_part <- c("eye and nose", "eye", "eye and ear", "eye and mouth", "foot", "foot", "ear", "ear", "foot", "mouth")

> var2 <- c("bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla")

> temp_df <- data.frame(var_body_part, var2)

所以我的数据是:

> temp_df
   var_body_part var2
1   eye and nose  bla
2            eye  bla
3    eye and ear  bla
4  eye and mouth  bla
5           foot  bla
6           foot  bla
7            ear  bla
8            ear  bla
9           foot  bla
10         mouth  bla

每次我找到“眼睛”时,我都想用HEAD替换行 即(请参阅前4行)

   var_body_part var2
1           HEAD  bla
2           HEAD  bla
3           HEAD  bla
4           HEAD  bla
5           foot  bla
6           foot  bla
7            ear  bla
8            ear  bla
9           foot  bla
10         mouth  bla

应该很容易... 我选择受

转换影响的行
temp_df$var_body_part[grep("eye", temp_df$var_body_part) ] 

但是我找不到正确的语句以将其替换为正确的值“ HEAD”。

到目前为止,我的尝试很多。

invalid factor level, NA generated

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

问题实际上是在创建temp_df时将列转换为factor。只需使用stringsAsFactors = FALSE,您就可以使用了:

temp_df <- data.frame(var_body_part, var2, stringsAsFactors = FALSE)
temp_df$var_body_part[grep("eye", temp_df$var_body_part)] <- "HEAD"

如果要使用因素,可以将{HEAD}添加到var_body_part的级别:

temp_df <- data.frame(var_body_part, var2, stringsAsFactors = TRUE)
levels(temp_df$var_body_part) <- c(levels(temp_df$var_body_part), "HEAD")
temp_df$var_body_part[grep("eye", temp_df$var_body_part)] <- "HEAD"

答案 1 :(得分:2)

您可以将transformsub一起使用:

transform(temp_df, var_body_part = sub(".*eye.*", "HEAD", var_body_part))

结果:

   var_body_part var2
1           HEAD  bla
2           HEAD  bla
3           HEAD  bla
4           HEAD  bla
5           foot  bla
6           foot  bla
7            ear  bla
8            ear  bla
9           foot  bla
10         mouth  bla

答案 2 :(得分:0)

使用gsub()非常简单:

mutate_at(temp_df, 'var_body_part', funs(gsub('.*eye.*', 'HEAD', .)))