通过R中的变量将行重塑为列表

时间:2019-06-18 18:20:43

标签: r dplyr data.table reshape

我有一个看起来像这样的数据框:

import React, { Component } from 'react';
import Nav from './app-components/nav'
import Sidebar from './app-components/sidebar'
import Compose from './app-components/compose'
import Chat from './app-components/chat'


export class home extends Component {

    constructor(props) {
        super(props)
    
        this.state = {
             
        }
    }


    

    render() {
        return (
            <div className="layout">

                <Nav />
                <Sidebar />
                <Chat />
                <Compose />
            
            </div>
        )
    }
}

export default home

我的目标是将其重塑为一个数据框,按给出的顺序将这些类收集到一个列表中。例如,输出看起来像:

import errno
import glob

path = '/path/to/key_files/*.txt'
SubjectName = 'predetermined'

files = glob.glob(path)
for filename in files:
    try:
        with open(filename, 'r+') as f:
           for line in f:
               if SubjectName in line:
                   print(line)
    except IOError as exc:
        if exc.errno != errno.EISDIR:
            raise

或者,或者是一个两列数据帧,其中第一列包含id,第二列依次包含 class id 1 foo 1 2 bar 1 3 baz 1 4 baz 2 5 bar 2 6 foo 2 7 foo 3 8 foo 3 9 foo 3 变量列表。

我已经尝试过使用reshape库中的> output id var1 var2 var3 1 1 foo bar baz 2 2 baz bar foo 3 3 foo foo foo ,但是并不能完全返回所需的输出。

关于如何在R中执行此操作的任何想法?数据如下:

id

2 个答案:

答案 0 :(得分:2)

我们通过'id'创建一个序列列,然后使用spread

library(tidyverse)
test %>% 
     group_by(id) %>% 
     mutate(rn = str_c("var", row_number())) %>% 
      spread(rn, class)
# A tibble: 3 x 4
# Groups:   id [3]
#     id var1  var2  var3 
#  <dbl> <chr> <chr> <chr>
#1     1 foo   bar   baz  
#2     2 baz   bar   foo  
#3     3 foo   foo   foo  

以防万一

test %>%
     group_by(id) %>%
     mutate(rn = paste0("var", row_number())) %>%
     spread(rn, class)

test %>%
    group_by(id) %>%
    mutate(rn = paste("var", row_number(), sep="")) %>%
    spread(rn, class)

或者使用data.table,使用rowiddcast

创建序列
library(data.table)
dcast(setDT(test), id ~ paste0("var", rowid(id)), value.var = 'class')
#    id var1 var2 var3
#1:  1  foo  bar  baz
#2:  2  baz  bar  foo
#3:  3  foo  foo  foo

如果我们要使用base R,则将avereshape一起使用

reshape(transform(test, rn = paste0("var", ave(seq_along(id), id,
   FUN = seq_along))), idvar = 'id', direction = 'wide', timevar = 'rn')

注意:当重复数不相等时,所有方法都可以使用

答案 1 :(得分:0)

您可以通过 CNode [ title=All data, key=__ALL__, expanded=false, leaf=false, checked=false, isFolder=true, disabled=false, hideCheckbox=false, visible=true, tooltip=null, children=[ CNode [ title=AAAA, key=20, expanded=false, leaf=false, checked=false, isFolder=true, disabled=false, hideCheckbox=false, visible=true, tooltip=null, children=[ CNode [ title=A1, key=20010, expanded=false, leaf=true, checked=false, isFolder=false, disabled=false, hideCheckbox=false, visible=true, tooltip=, children=null], CNode [ title=A2, key=20020, expanded=false, leaf=true, checked=false, isFolder=false, disabled=false, hideCheckbox=false, visible=true, tooltip=, children=null], CNode [ title=A3, key=20030, expanded=false, leaf=true, checked=false, isFolder=false, disabled=false, hideCheckbox=false, visible=true, tooltip=, children=null] split有趣的列id来填充数据框。

cbind

注意:使用data.frame(id=unique(d$id), t(do.call(cbind, split(d$class, d$id)))) # id X1 X2 X3 # 1 1 foo bar baz # 2 2 baz bar foo # 3 3 foo foo foo 来避免不需要的因素。

数据

cbind.data.frame