通过添加R中其他单元格和行的值来扩展数据框中的值

j0pj023g  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(126)

我试着用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。
此致

lokaqttq

lokaqttq1#

好的,谢谢你的帮助!我用for循环得到了它:

n <- 0
df<-mutate(df,Structure=NA)
for (i in 1:nrow(df)) {
  if (df[i, 1] == "0") {
    first_step <- df[i, 2]
    values<-first_step
    df$Structure[which(is.na(df$Structure))[1]]<-values
  }
  else if (df[i, 1] == "1") {
    second_step <- df[i, 2]
    values <- paste(first_step, second_step)
    df$Structure[which(is.na(df$Structure))[1]]<-values
  }
  else if (df[i, 1] == "2") {
    third_step <- df[i, 2]
    values <- paste(first_step, second_step, third_step)
    df$Structure[which(is.na(df$Structure))[1]]<-values
  }
  else if (df[i, 1] == "3") {
    fourth_step <- df[i, 2]
    values <- paste(first_step, second_step, third_step, fourth_step)
    df$Structure[which(is.na(df$Structure))[1]]<-values
  }
  n <- n + 1
}

相关问题