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

分离数据中包含的字符串。框架并基于拆分创建新的关联值

袁高明
2023-03-14

我有一个大的数据集,其中一些行包含多个用逗号分隔的县。我一直在尝试将它们分成单独的行,用与字符串相关的货币价值除以字符串中县的数量。除了有县字符串之外,还有全州范围的值必须在该州的每个县之间拆分。为了一个易于复制的例子,我们将不得不假设马里兰州只有三个县。对于一个可复制的例子,我将在下面粘贴一些代码:

> df1 <- data.frame(State = 
c("Maryland","Maryland","Maryland","Washington","Arizona","California"),
County = c("Baltimore,Montgomery,Frederick","Statewide","Baltimore, 
Carrol","Douglas","Washington","San Bernadino,Orange"),Spending = 
c(15000,20000,10000,5000,2000,34000))
> print(df1)
       State                         County Spending
1   Maryland Baltimore,Montgomery,Frederick    15000
2   Maryland                      Statewide    20000
3   Maryland              Baltimore, Carrol    10000
4 Washington                        Douglas     5000
5    Arizona                     Washington     2000
6 California           San Bernadino,Orange    34000

我希望输出看起来像下面打印的data.frame。

> df2 <- data.frame(State = c("Maryland","Maryland","Maryland","Maryland",
"Washington","Arizona","California","California"),County = 
c("Baltimore","Montgomery","Frederick","Carrol","Douglas",
"Washington","San Bernadino","Orange"),
Spending = c(15000,10000,10000,10000,5000,2000,17000,17000))
> print(df2)
       State        County Spending
1   Maryland     Baltimore    15000
2   Maryland    Montgomery    10000
3   Maryland     Frederick    10000
4   Maryland        Carrol    10000
5 Washington       Douglas     5000
6    Arizona    Washington     2000
7 California San Bernadino    17000
8 California        Orange    17000

诡计在于并非所有行都有县字符串,并且全州范围的值必须基于州内包含的县的数量。

共有1个答案

钱弘壮
2023-03-14

我可以自由地稍微修改你的数据框,因为它不起作用(正如评论者所说)。这是你要找的吗?

df1 <- data.frame(State = 
                c("Maryland","Maryland","Washington","Arizona","California"),County = 
                c("Baltimore,Montgomery,Frederick","Statewide","Douglas","Washington","San Bernadino,Orange"),Spending = c(15000, 15000,6000,2000,34000))

library(dplyr)
library(stringr)
library(tidyr)


df1 %>% 
  group_by(State) %>% # group by state
  mutate(Total_Spending = sum(Spending)) %>% # calculate total spending
  filter(County != "Statewide") %>% # delete rows for statewide as they don't count as a county
  separate_rows(County, sep = ",") %>% # expand rows
  mutate(Spending_PC = Total_Spending / n()) # calculate spending per county

根据OP提供的新信息进行编辑:

我采取了或多或少的五步方法:

>

  • 把全州的行去掉,以后再处理
  • 与其余的一起,计算每行中的县数(通过查看县中逗号的数量),并相应地划分支出金额
  • 展开行
  • 按县分组并总结其支出
  • 加入全州信息并将其分发给各县(根据该州的县数进行调整)

    statewide <- df1 %>% 
      filter(County == "Statewide") %>% 
      select(-County, Spending_State = Spending)
    
    df1 %>% 
      filter(County != "Statewide") %>%  # drop the statewide rows 
      # divide the spending of each row by the number of counties (as counted by "," + 1)
      mutate(Spending_div = Spending / (str_count(County, ",") + 1)) %>% 
      separate_rows(County, sep = ",") %>% # expand rows
      # calculate spending per county (account for multiple rows per county)
      group_by(State, County) %>% 
      summarize(Spending_County = sum(Spending_div)) %>%  
      # join the statewide spending 
      left_join(statewide) %>% 
      replace_na(list(Spending_State = 0)) %>% # replace non matched with 0 
      # calculate final value 
      group_by(State) %>% # group to get number of counties in each state to distribute the Spending_State
      mutate(Spending_County = Spending_County + (Spending_State / n()))
    

    还有一种方法可以做到这一点,而不必首先提取全州范围的信息,但这更为混乱,也不那么“整洁”。

  •  类似资料:
    • 我是 Perl 的新手,但根据我阅读的文档,看起来 Perl 中的 split 函数要求正则表达式模式而不是字符串分隔符作为第一个参数,但我发现使用 之类的东西仍然可以正确拆分字符串。 基于此,我尝试使用可变分隔符(例如。< code>print (split($var,$ string))[0] where < code > $ var = ' ' )并发现它不起作用。我做错了什么? 谢谢! 编

    • 我对神谕主题有意见 我们有一个表,其中一列存储由逗号(,)ex分隔的数据 我们需要能够分离这个值,并得到这样的结果 但是这个列的数量并不是固定的,一些类型可能是不同的数据湖,我们需要动态响应,例如 如果我为1运行进程,结果与以前一样 但是如果我为类型2运行它,结果应该如下 我们可以将项目字段转换为varchar2表,但我们找不到如何将其转换为使用游标。任何想法?非常感谢!对不起,如果我的英语不被理

    • 这个问题类似于我之前的问题拆分一个包含破折号和减号的字符串。但我问错了,然后它得到了稍微不同的语义,人们从这个角度回答(包括)。因此,与其修改这个问题,我认为最好是提出一个新问题。 我必须拆分一个包含连字符-减号和减号的字符串。我尝试根据Unicode字符(https://en.wikipedia.org/wiki/Hyphen#Unicode)进行拆分,但考虑到减号与连字符-减号相同。有什么方法

    • 问题内容: 如何将这个列表分为两个列表,一个包含字符串,另一个包含整数(以 雅致/ pythonic 方式)? 输出: 注意:没有实现这样的列表,只是想过如何找到一个很好的答案(有没有?)来解决这个问题。 问题答案: 正如其他人在评论中提到的那样,您应该真正开始思考如何摆脱最初包含非均匀数据的列表。但是,如果确实 不能 做到这一点,我将使用defaultdict:

    • 问题内容: 和创建之间有什么区别?请告诉我 在String中,我们只有String对象,然后为什么要区别对待这两个对象。s1和s2具有不同的存储地址,而s3和s4具有相同的存储地址。为什么它基于 运算符。 问题答案: 加载定义Java字符串中代表字符串文字的对象的类时,它们将被添加到共享池中。这样可以确保String文字的所有“副本”实际上是同一对象……即使该文字出现在多个类中。这就是为什么是。

    • 创建和有什么区别?请让我知道 在String中,我们只有String对象,那么为什么它将这两个对象区别对待。s1和s2具有不同存储器地址,而s3和s4具有相同的存储器地址。为什么它基于运算符工作?