当前位置: 首页 > 知识库问答 >
问题:

根据R dplyr中的条件将字符转换为NA

柯梓
2023-03-14

我有一个像这样的数据框

library(tidyverse)
df3 <- tibble(col1 = c("apple",rep("banana",3)),
              col2 = c("aple", "banan","bananb","banat"), 
              count_col1 = c(1,4,4,4), 
              count_col2 = c(4,1,1,1))
df3
#> # A tibble: 4 × 4
#>   col1   col2   count_col1 count_col2
#>   <chr>  <chr>       <dbl>      <dbl>
#> 1 apple  aple            1          4
#> 2 banana banan           4          1
#> 3 banana bananb          4          1
#> 4 banana banat           4          1

由reprex包(v2.0.1)于2022-02-17创建

我想group_by col1,当count_col2

当count_col1

我希望我的数据看起来像这样

#> # A tibble: 4 × 4
#>   col1    col2        count_col1 count_col2
#>   <chr>   <chr>          <dbl>      <dbl>
#> 1   NA    aple             1          4
#> 2 banana   NA              4          1
#> 3 banana   NA              4          1
#> 4 banana   NA              4          1

我不确定这是否可以通过变异(case_when…)来实现。到目前为止,我失败了

df3 %>% 
  group_by(col1) %>% 
  mutate(case_when(count_col2 > count_col1 ~ col1==NA,
                   count_col1 > count_col2 ~ col2==NA ))

共有2个答案

柯波娃
2023-03-14

我不确定您是否真的需要在这里使用<code>group_。在一个“群体”内没有发生任何事情。

这是一个基本的R选项-

df3$col1[df3$count_col2 > df3$count_col1] <- NA
df3$col2[df3$count_col1 > df3$count_col2] <- NA
df3

#  col1   col2  count_col1 count_col2
#  <chr>  <chr>      <dbl>      <dbl>
#1 NA     aple           1          4
#2 banana NA             4          1
#3 banana NA             4          1
#4 banana NA             4          1
韦叶秋
2023-03-14

您可以使用ifelse()实现所需的输出,即

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

df3 <- tibble(col1 = c("apple",rep("banana",3)),
              col2 = c("aple", "banan","bananb","banat"), 
              count_col1 = c(1,4,4,4), 
              count_col2 = c(4,1,1,1))
df3
#> # A tibble: 4 × 4
#>   col1   col2   count_col1 count_col2
#>   <chr>  <chr>       <dbl>      <dbl>
#> 1 apple  aple            1          4
#> 2 banana banan           4          1
#> 3 banana bananb          4          1
#> 4 banana banat           4          1

df3 %>% 
  group_by(col1) %>% 
  mutate(col1 = ifelse(count_col2 > count_col1, NA, col1),
         col2 = ifelse(count_col1 > count_col2, NA, col2))
#> # A tibble: 4 × 4
#> # Groups:   col1 [2]
#>   col1   col2  count_col1 count_col2
#>   <chr>  <chr>      <dbl>      <dbl>
#> 1 <NA>   aple           1          4
#> 2 banana <NA>           4          1
#> 3 banana <NA>           4          1
#> 4 banana <NA>           4          1

由reprex包(v2.0.1)于2022-02-18创建

或者使用case_when()

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

df3 <- tibble(col1 = c("apple",rep("banana",3)),
              col2 = c("aple", "banan","bananb","banat"), 
              count_col1 = c(1,4,4,4), 
              count_col2 = c(4,1,1,1))
df3
#> # A tibble: 4 × 4
#>   col1   col2   count_col1 count_col2
#>   <chr>  <chr>       <dbl>      <dbl>
#> 1 apple  aple            1          4
#> 2 banana banan           4          1
#> 3 banana bananb          4          1
#> 4 banana banat           4          1

df3 %>% 
  group_by(col1) %>% 
  mutate(col1 = case_when(count_col2 > count_col1 ~ NA_character_,
                          TRUE ~ col1),
         col2 = case_when(count_col1 > count_col2 ~ NA_character_, 
                          TRUE ~ col2))
#> # A tibble: 4 × 4
#> # Groups:   col1 [2]
#>   col1   col2  count_col1 count_col2
#>   <chr>  <chr>      <dbl>      <dbl>
#> 1 <NA>   aple           1          4
#> 2 banana <NA>           4          1
#> 3 banana <NA>           4          1
#> 4 banana <NA>           4          1

由reprex包(v2.0.1)于2022-02-18创建

这能解决你的问题吗?

 类似资料:
  • 我最近在CodeWars中遇到了这个问题 给定一个数字串,您应该用“0”替换5以下的任何数字,用“1”替换5及以上的任何数字。返回结果字符串。注意:输入永远不会是空字符串 我来自 Python 背景,我们可以使用 if 语句进行索引来解决这个特定问题,如下所示: 但当我尝试在Swift中使用索引(如Python风格)时,我失败了……经过一段时间的研究,我发现了这个方法:<code>String。r

  • 请帮我把CLOB转换成C#代码中的字符串。

  • 我展示了一个包含JSON的数组,并直接用超文本标记语言展示了这个数组,在这里你可以找到。它给NaN作为输出。 这是我的超文本标记语言:

  • 问题内容: 基本上,我的问题与这一问题相同,但是对于Java的(JBoss)Hibernate:我们如何使用hibernate标准API将列作为int排序?我想创建一个从字符串列转换为int的订单限制。就像是 唯一的例外是“无法解析属性:[Class]的演员表(id为int)”。我已经尝试过使用int和integer进行cast(as)和convert(,)。 问题答案: 尽管主题很旧,可能是问题

  • 本文向大家介绍如何将R数据帧中的字符串转换为NA?,包括了如何将R数据帧中的字符串转换为NA?的使用技巧和注意事项,需要的朋友参考一下 我们经常会在数据收集过程中发现错误,这些错误可能会导致研究结果不正确。当错误地收集数据时,将使分析师的工作变得困难。显示数据有错误的一种情况是获取字符串代替数字值。因此,我们需要将这些字符串转换为R中的NA,以便我们可以进行预期的分析。 示例 请看以下数据帧- 将

  • 问题内容: 我想在GO中将字符串数组转换为字节数组,以便可以将其写到磁盘上。将字符串数组()解码为字节数组()的最佳解决方案是什么? 我正在考虑对字符串数组进行两次迭代,第一个迭代以获得字节数组所需的实际大小,然后第二个迭代写入每个元素的长度和实际字符串()。 解决方案必须能够以其他方式进行转换;从一个到一个。 问题答案: 让我们忽略一个事实,那就是走一秒钟。您需要做的第一件事是将序列化格式编组为