简体   繁体   English

有什么方法可以从 R 和 append 中的数据框列中拆分键和值作为数据框每一行的列名称和值?

[英]Any ways to split key and value from a column of a data frame in R, and append the keys as columns name and value for each row of the data frame?

I have a data frame as below:我有一个数据框如下:

source <- data.frame("name" = c('name1', 'name2', 'name3', 'name4'),
                 "section" = c('section1', 'section2', 'section3', 'section4'),
                 "values" = c("Type of information:experimental study\nReliability:1 (reliable without restriction)\n\n\nTest guideline, Qualifier:according to\n\n\nGLP compliance:yes\n\n\nEffect concentrations, Effect conc.:0.01 mg/L\n\nEffect concentrations, Effect conc.:0.01 mg/L\n\n\n",
                              "Type of information:experimental study\nReliability:2 (reliable with restrictions)\n\n\nTest guideline, Qualifier:according to\n\nTest guideline, Qualifier:according to\n\n\nGLP compliance:yes\n\n\nEffect concentrations, Effect conc.:0.002 mg/L\n\nEffect concentrations, Effect conc.:0.003 mg/L\n\nEffect concentrations, Effect conc.:0.002 mg/L\n\nEffect concentrations, Effect conc.:0.005 mg/L\n\n\n",
                              "Type of information:experimental study\nReliability:2 (reliable with restrictions)\n\n\nTest guideline, Qualifier:according to\n\nTest guideline, Qualifier:according to\n\nTest guideline, Qualifier:according to\n\n\nGLP compliance:yes Good laboratory practice compliance statement of July 11, 2014\n\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\nEffect concentrations, Dose descriptor:NOEC\nEffect concentrations, Effect conc.:9 µg/L\n\n\n",
                              "Type of information:experimental study\nReliability:2 (reliable with restrictions)\n\n\nTest guideline, Qualifier:according to\n\n\nGLP compliance:yes\n\n\nEffect concentrations, Effect conc.:ca. 0.007 mg/L\n\n\n"
                              ))

My ideal result is:我的理想结果是:

source_1 <- data.frame("name" = c('name1', 'name2', 'name3', 'name4'),
                     "section" = c('section1', 'section2', 'section3', 'section4'),
                     "key1" = c('value1'),
                     "key2" = c('value2'),
                     "key3" = c(NA, NA, 'value3', NA),
                     "key4" = c(NA, 'value4', NA, 'value4'),
                     "key5" = c(NA, NA, 'value5', 'value5'))

I was able to get a list of key and a list of value, but don't know how to turn the keys to the column name and assign the value.我能够获得键列表和值列表,但不知道如何将键转换为列名并分配值。 It will be much appreciated if I can get help from you.如果我能得到你的帮助,我将不胜感激。

Here is one way to do this using tidyr library:这是使用tidyr库执行此操作的一种方法:

We first get the data in long form by splitting on new line character ( '\n' ), get data in two columns splitting on colon ( : ) and finally get data in wide format.我们首先通过换行符 ( '\n' ) 拆分来获取长格式的数据,在冒号 ( : ) 上拆分的两列中获取数据,最后获取宽格式的数据。

library(dplyr)
library(tidyr)

source %>%
  separate_rows(values, sep = '\n') %>%
  separate(values, c('key', 'value')) %>%
  pivot_wider(names_from = key, values_from = value)

#  name  section  key1   key2   key4   key3   key5  
#  <chr> <chr>    <chr>  <chr>  <chr>  <chr>  <chr> 
#1 name1 section1 value1 value2 NA     NA     NA    
#2 name2 section2 value1 value2 value4 NA     NA    
#3 name3 section3 value1 value2 NA     value3 value5
#4 name4 section4 value1 value2 value4 value3 value5

Your original dataset requires some data cleaning.您的原始数据集需要一些数据清理。

source %>%
  separate_rows(values, sep = '\n+') %>%
  filter(values != '') %>%
  separate(values, c('key', 'value'), sep = ':') %>%
  group_by(name, section, key) %>%
  summarise(value = toString(unique(value))) %>%
  pivot_wider(names_from = key, values_from = value)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM