我有一个大的数据集,其中一些行包含多个用逗号分隔的县。我一直在尝试将它们分成单独的行,用与字符串相关的货币价值除以字符串中县的数量。除了有县字符串之外,还有全州范围的值必须在该州的每个县之间拆分。为了一个易于复制的例子,我们将不得不假设马里兰州只有三个县。对于一个可复制的例子,我将在下面粘贴一些代码:
> 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
诡计在于并非所有行都有县字符串,并且全州范围的值必须基于州内包含的县的数量。
我可以自由地稍微修改你的数据框,因为它不起作用(正如评论者所说)。这是你要找的吗?
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具有相同的存储器地址。为什么它基于运算符工作?