您好,我有一个样例数据集,如下所示.

# Load the tidyverse package
library(tidyverse)

# Create the dataset
id <- 1:6
model <- c("0RB3211", NA, "0RB4191",
           NA, "0RB4033", NA)
UPC <- c("805289119081", "DK_0RB3447CP_RBCP  50", "8053672006360",
         "Green_Classic_G-15_Polar_1.67_PREM_SV", "805289044604",
         "DK_0RB2132CP_RBCP  55")
df <- tibble(id, model, UPC)

enter image description here

对于‘MODEL’列中缺少的值,如果其对应的UPC以DK开头,我需要提取第一个下划线后面的7位数字和字母,然后将其放入‘MODEL’列.例如,对于第二行,我需要将"0RB3447"放入‘MODEL’列,对于第四行,我需要删除整行,对于最后一行,我需要将"0RB2132"放入‘MODEL’列.

Here is my expected result: enter image description here

# Manipulate the dataset
df_cleaned <- df %>%
  rowwise() %>%
  mutate(model = ifelse(is.na(model) & str_detect(UPC, "^DK"),
                        str_extract(UPC, "\\d{2}RB\\d{4}"),
                        model)) %>%
  ungroup() %>%
  filter(!(is.na(model) & str_detect(UPC, "[^0-9]")))

# Display the cleaned dataset
print(df_cleaned)

However, it only returns this wrong result. enter image description here

如何修改我以前的代码? 真的很感激.

推荐答案

代替ifelse,另一个选项是coalesce和现有的model,从而它仅用来自用str_replace提取的UPC的子串替换模型中的NAS.以后只保留模型以0开始的行.

library(dplyr)
library(stringr)
 df %>% 
  mutate(model = coalesce(model,
      str_replace(UPC, ".*_(0[^_]+\\d+)[A-Z]+_.*", "\\1"))) %>% 
   filter(str_detect(model, "^0"))

-输出

# A tibble: 5 × 3
     id model   UPC                  
  <int> <chr>   <chr>                
1     1 0RB3211 805289119081         
2     2 0RB3447 DK_0RB3447CP_RBCP  50
3     3 0RB4191 8053672006360        
4     5 0RB4033 805289044604         
5     6 0RB2132 DK_0RB2132CP_RBCP  55

在OP的代码中,不需要rowwise,因为ifelse是矢量化的.此外,\\d{2}不会与0RB..中的某些字符串匹配,它只显示一个数字,而不是RB前面的2.因此,使用+表示一个或多个数字

df %>%
  mutate(model = ifelse(is.na(model) & str_detect(UPC, "^DK"),
                        str_extract(UPC, "(?<=_)\\d+RB\\d{4}"),
                        model)) %>%
  filter(complete.cases(model))

-输出

# A tibble: 5 × 3
     id model   UPC                  
  <int> <chr>   <chr>                
1     1 0RB3211 805289119081         
2     2 0RB3447 DK_0RB3447CP_RBCP  50
3     3 0RB4191 8053672006360        
4     5 0RB4033 805289044604         
5     6 0RB2132 DK_0RB2132CP_RBCP  55

R相关问答推荐

是否有任何解决方案可以优化VSCode中RScript的图形绘制?

混淆矩阵,其中每列和等于1

使用lapply的重新定位功能

ggplot 2中的地块底图(basemaps_gglayer()不起作用)

selectInput不返回ALL,并将因子转换为shiny 的数字

使用tidy—select创建一个新的带有mutate的摘要变量

当月份额减go 当月份额

如何调整曲线图中的y轴标签?

根据元素和前一个值之间的差值过滤矩阵的元素

在ggplot2的框图中绘制所有级别的系数

展开对数比例绘图的轴(添加填充)

使用RSelenium在R中抓取Reddit时捕获多个标签

更新R中的数据表(使用data.table)

函数可以跨多个列搜索多个字符串并创建二进制输出变量

将多个变量组合成宽格式

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

如何在内联代码中添加额外的空格(R Markdown)

分隔日期格式为2020年7月1日

将`magick`对象转换为原始向量

根据列和行的不同组合 Select 各种单元格