长期倾听者,第一次来电,所以如果我在帖子中或一般情况下遗漏了重要信息,我深表歉意。
简而言之,我有两列,其中一列填充了每个单元格(行为)。另一个(游戏)除了少数单元格外大部分都是NA,但每个单元格中的内容不一定相同。对于游戏中的每一个非NA,无论内容如何,我都想用它来替换行为列中相应行的数据。
这是数据:
behavior<-c("run","jump","play","walk","jump","walk","run","play","jump","jump")
game<-c(NA,"tag",NA,NA,NA,"slide",NA,"tag",NA,"hopscotch")
test<-data.frame(behavior,game)
behavior game
1 run NA
2 jump tag
3 play NA
4 walk NA
5 jump NA
6 walk slide
7 run NA
8 play tag
9 jump NA
10 jump hopscotch
我希望它看起来像:
behavior game
1 run NA
2 tag tag
3 play NA
4 walk NA
5 jump NA
6 slide slide
7 run NA
8 tag tag
9 jump NA
10 hopscotch hopscotch
我尝试过使用 !(test$game==NA) 和 if/else 之类的东西来编写函数,但我认为我在这里遗漏了一些基本的东西。这看起来相当简单,但在搜索 stackoverflow 后,我看到了大量关于如何替换 NA 的建议,但没有关于如何仅使用非 NA 来替换已填充的单元格的建议。出于好奇,我也很感兴趣是否有一种方法可以交换单元格值,因此第二行将是标记/跳转而不是标记/标记。很高兴提供任何额外的信息/说明,非常感谢任何建议。
最佳答案
将数据读取为字符串而不是因子
test<- data.frame(behavior,game, stringsAsFactors = FALSE)
我们可以将简单的ifelse
与transform
结合使用,其中behavior
的值根据NA
值进行更改游戏
列。
transform(test, behavior = ifelse(is.na(game), behavior, game))
# behavior game
#1 run <NA>
#2 tag tag
#3 play <NA>
#4 walk <NA>
#5 jump <NA>
#6 slide slide
#7 run <NA>
#8 tag tag
#9 jump <NA>
#10 hopscotch hopscotch
因子
在内部存储为数字,如果您不将它们作为字符读取,那么相同的代码将产生
test<- data.frame(behavior,game)
transform(test, behavior = ifelse(is.na(game), behavior, game))
# behavior game
#1 3 <NA>
#2 3 tag
#3 2 <NA>
#4 4 <NA>
#5 1 <NA>
#6 2 slide
#7 3 <NA>
#8 3 tag
#9 1 <NA>
#10 1 hopscotch
这会非常困惑且难以调试。或者,我们可以使用 as.character
覆盖因子值,这将给出预期的输出。
transform(test, behavior = ifelse(is.na(game), as.character(behavior),
as.character(game)))
关于r - 仅使用非 NA 单元格替换另一列中的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59750886/