如何解决从R中的单个列中提取许多变量
我正在处理卡住的数据清理问题。我已经开始以下面所示的格式接收csv文件,并且需要先清理它,然后才能进行任何分析。这样的列有几列,每个单元格中可能需要提取数百个变量。
Original <- structure(list(CustNum = c(0,1),Sales = c("[1000,345,Zero,56]","[987,879,325,4568]"),Amounts = c("[10,2,98]","[57,25,52,75]"),Number = c("['1','2','3','4']","['4','1']"),Identifier = c("A","B")),row.names = c(NA,-2L),class = c("tbl_df","tbl","data.frame"))
我正在尝试将其纠缠成这种格式。
Desired <- tibble(CustNum = c(0,1,Sales = c(1000,"Zero",56,987,4568),Amounts = c(10,98,57,75),Number = c(1,3,4,"A","B","B"))
我尝试了以下类型的许多不同变体,但无济于事。
Original$Sales %>%
str_replace("\\[","") %>%
str_replace("\\]","") %>%
str_replace("'","")
在Excel中的Power Query中进行清理很容易,但是想找到一种在R中进行清理的方法,因此我不必使用几种不同的工具。谁能告诉我该怎么做?
解决方法
尝试一下:
library(dplyr) # must be version >= 1.0.0
library(stringr)
Original %>%
mutate(across(everything(),str_remove_all,pattern = "\\[|\\]|\\'")) %>%
mutate(across(everything(),str_split,pattern = ",")) %>%
tidyr::unnest(everything()) %>%
mutate(across(everything(),str_trim)) %>%
mutate(across(c(CustNum,Amounts,Number),as.numeric))
# A tibble: 8 x 5
CustNum Sales Amounts Number Identifier
<dbl> <chr> <dbl> <dbl> <chr>
1 0 1000 10 1 A
2 0 345 2 2 A
3 0 Zero 0 3 A
4 0 56 98 4 A
5 1 987 57 4 B
6 1 879 25 3 B
7 1 325 52 2 B
8 1 4568 75 1 B
基本上:
- 删除
[
]
'
- 由
,
分割
- 嵌套列表
- 修剪不必要的空间
- 在必要时设置为数字
您可以尝试这种方法
library(tidyverse)
library(stringr)
Original2 <- Original %>%
mutate_at(vars(Sales,~str_replace_all(.,"\\[|\\'|\\]|\\s","")) %>%
separate_rows(c("Sales","Amounts","Number"),sep = ",")
# CustNum Sales Amounts Number Identifier
# <dbl> <chr> <chr> <chr> <chr>
# 1 0 1000 10 1 A
# 2 0 345 2 2 A
# 3 0 Zero 0 3 A
# 4 0 56 98 4 A
# 5 1 987 57 4 B
# 6 1 879 25 3 B
# 7 1 325 52 2 B
# 8 1 4568 75 1 B
在这里,我们替换[,'和空格,然后使用separate_rows()
包中的tidyr
来分隔行。要实现我们的目标,需要两个步骤。
我建议这种方法首先将Original
的数据重整为长,然后再用sep=','
分隔行。之后,您将清理变量以删除一些特殊字符。因此,您可以按组创建一个id变量,以便在Desired
中将数据转换为所需的宽度:
library(tidyverse)
#Reshape
Original %>%
pivot_longer(cols = -c(CustNum,Identifier)) %>%
separate_rows(value,sep = ',') %>%
mutate(value=trimws(gsub("[[:punct:]]"," ",value))) %>%
group_by(name) %>% mutate(id=1:n()) %>%
pivot_wider(names_from = name,values_from=value) %>%
ungroup() %>%
select(-id)
输出:
# A tibble: 8 x 5
CustNum Identifier Sales Amounts Number
<dbl> <chr> <chr> <chr> <chr>
1 0 A 1000 10 1
2 0 A 345 2 2
3 0 A Zero 0 3
4 0 A 56 98 4
5 1 B 987 57 4
6 1 B 879 25 3
7 1 B 325 52 2
8 1 B 4568 75 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。