我试着用dply和ggplot2分析R中的XML数据,我的代码能够将XML数据转换成数据框架,不幸的是结构丢失了。
我的XML文档有以下结构的例子:
<?xml version="1.0" encoding="UTF-8"?>
<Budget price="1234" items="1234" year="1990">
<Account name="a" value="123" step="0">
<Account name="1" value="12" step="1"/>
<Account name="1.1" value="12" step="2"/>
<Account name="2" value="12" step="1"/>
<Account name="2.1" value="9" step="2"/>
<Account name="2.2" value="3" step="2"/>
<Account name="3" value="99" step="1"/>
<Account name="3.1" value="78" step="2"/>
<Account name="3.1.1" value="70" step="3"/>
<Account name="3.1.2" value="8" step="3"/>
<Account name="3.2" value="21" step)="2"/>
</Account>
<Account name="b" value="234" step="0">
<Account name="1" value="200" step="1"/>
等等
首先,我保存所有值:
budget_values=xml_find_all(doc,"//Budget",flatten=FALSE)
然后,我选择一些值:
step_ids=purrr::map_chr(budget_values, ~xml_attr(.,"step"))
name_values=purrr::map_chr(budget_values, ~xml_attr(.,"name"))
values=purrr::map_chr(budget_values, ~xml_attr(.,"value"))
在组合列表中保存属性:
values_list<-list((step_ids),(name_values),(values))
并将其转换为 Dataframe :
budget_df<-data.frame(sapply(values_list, c))
很好。我收到了一个这样的DF:
| 步骤ID|姓名|弗劳埃|
| - ------| - ------| - ------|
| 无|项目a| 1234|
| 1个|1个|十二|
| 第二章|1.1节|十二|
| 1个|第二章|十二|
| 第二章|二、一|九|
| 第二章|二、二|三个|
| 1个|三个|九十九|
| 无|b.人口基金|二百三十四|
| 1个|1个|二百|
等等
正如您从示例中看到的,一些名称是重复的-通常是步骤1和2;步骤3通常是非常独特。
我的目标是遵循数据框架:
| 步骤ID|姓名|弗劳埃||- -------| - -------|― ― ― ― ― ― ―||无| 项目a|1234||1个|a1|十二||第二章|a1.1条|十二||1个|a2|十二||第二章|a2.1条|九||第二章|a2.2条|三个||1个|a3|九十九||无|b.人口基金|二百三十四||1个|b1|二百|等等
以更结构化地分析数据。例如:我需要所有步骤1的值。现在我无法分辨它来自哪个预算。使用新名称后,我可以看到:这个值来自预算A,这个值来自预算B,等等。
我尝试遵循for循环并将结果存储在新的 Dataframe 中
df<-for (rows in budget_df) {
if (rows$`Step-ID` == "0") {
saved_name <- rows$name
print(saved_name)
}
else
(rows$`Step-ID` == "1"){
rows$Haushalt+saved_name
saved_names<-saved_name+rows$name
print(saved_names)
}
else(rows$`Step-ID`=="2"){
rows$Haushalt+saved_name
}
else(rows$`Step-ID`=="3"){
rows$name+saved_names
}
}
View(df)
我得到以下错误:
Error: unexpected '{' in:
" else
(rows$`Step-ID` == "1"){"
我的问题是:有没有更好的方法来分析数据或重命名名称中的值?
非常感谢您的帮助!
更新:
再次感谢@jpsmith。我尝试了以下代码来回应他的推荐:df-预算_df预算〈-"" df〈-用于(df中的行){mutate(case_when(df $Step-ID
=="0 "~预算〈-df $Haushalt,df $Step-ID
==" 2 "~变异(df,结构=粘贴(预算,df $Haushalt)),df $Step-ID
=="2 "~预算〈-c(预算,df $Haushalt),df $Step-ID
=="3 "~变异(df,结构=粘贴(值,df $Haushalt))))}
从逻辑上解释了我想做的事情,但不起作用。我认为,这是因为试图用"〈-"存储值?-我在"?case_when"处找不到其他存储值的方法。另一个代码(我已覆盖)存储Step-ID的值并扩展了同一步骤的Haushalt的值,而不是:步骤ID 0到Haushalt,步骤ID 1和步骤ID 0,步骤ID 1到Haushalt,步骤ID 2。
此致
1条答案
按热度按时间lokaqttq1#
好的,谢谢你的帮助!我用for循环得到了它: