【问题标题】:How do I transform a data frame to the desired structure and form?如何将数据框转换为所需的结构和形式?
【发布时间】:2020-05-14 12:02:13
【问题描述】:

我的数据是一个.xlsx 数据透视表。那里有几张纸,但我只需要一张来分析。在这张表上,我有一个看起来像这样的数据框

df <- data.frame(ind = c("ind1", "ind1", "ind1", "ind1", 
                         "ind2", "ind2", "ind2", "ind2",
                         "ind3", "ind3", "ind3", "ind3",
                         "ind4", "ind4", "ind4", "ind4"),
                 shr = c(-0.23, 0, 0.12, 0.68,
                         -0.54, 0.80, 0.14, -0.23,
                          0.48, 0.94, -0.01, 0.31,
                          0.18, 0.11, 0.98, 0.05))

以及其他具有不同类型数据的列。我不需要它们,只有我在示例中介绍的这两个。所以,df 是:

df
#    ind   shr
#1  ind1 -0.23
#2  ind1  0.00
#3  ind1  0.12
#4  ind1  0.68
#5  ind2 -0.54
#6  ind2  0.80
#7  ind2  0.14
#8  ind2 -0.23
#9  ind3  0.48
#10 ind3  0.94
#11 ind3 -0.01
#12 ind3  0.31
#13 ind4  0.18
#14 ind4  0.11
#15 ind4  0.98
#16 ind4  0.05

我需要将此数据框转换为这种形式:

df
#      shr
# ind1 -0.23 0.00 0.12 0.68
# ind2 -0.54 0.80 0.14 -0.23
# ind3 .....
# ind4 .....

或者,如果我的数据看起来像这样也会很方便:

df
# ind1   ind2   ind3   ind4
# -0.23   .      .
#  0.00   .      .
#  0.12   .      .
#  0.68   .      .

简而言之,我想让我的数据紧凑且便于进一步分析。主要困难是我的初始数据文件是.xlsx,具有不同的工作表和数据透视表。

(1) 如何从包含多个工作表的.xlsx 文件中提取数据? (2) 如何获得理想的 df 结构?

【问题讨论】:

标签: r excel dataframe pivot extract


【解决方案1】:

以下是转换数据的方法。 pivot_wider 来自 tidyr 需要一个 ID 列。在这里,我使用mutate(row = row_number()) 创建了一个。要从 excel 中读取数据,我建议使用 readxl 包。 read_xlsx 函数允许您指定excel工作表和范围。

library(dplyr)
df %>%
  group_by(ind) %>%
  mutate(row = row_number()) %>%
  pivot_wider(names_from= ind, values_from = shr) %>%
  select(-row)

# A tibble: 4 x 4
   ind1  ind2  ind3  ind4
  <dbl> <dbl> <dbl> <dbl>
1 -0.23 -0.54  0.48  0.18
2  0     0.8   0.94  0.11
3  0.12  0.14 -0.01  0.98
4  0.68 -0.23  0.31  0.05

【讨论】:

    【解决方案2】:

    您可以使用以下代码:

    list1<-c(1:4)
    df$col<-1:nrow(df)
    df$remainder<-df$col%%4
    df$col<-NULL
    
    dcast(df,ind~remainder, value.var = "shr" )
    
    >   ind     0     1    2     3
    1 ind1  0.68 -0.23 0.00  0.12
    2 ind2 -0.23 -0.54 0.80  0.14
    3 ind3  0.31  0.48 0.94 -0.01
    4 ind4  0.05  0.18 0.11  0.98
    
    dcast(df,remainder~ind, value.var = "shr" )
    
    >  remainder  ind1  ind2  ind3 ind4
    1         0  0.68 -0.23  0.31 0.05
    2         1 -0.23 -0.54  0.48 0.18
    3         2  0.00  0.80  0.94 0.11
    4         3  0.12  0.14 -0.01 0.98
    

    【讨论】:

    • dcast(setDT(df), ind~rowid(ind), value.var = 'shr')
    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2021-10-05
    • 1970-01-01
    • 2017-04-11
    • 2019-09-18
    • 2020-03-07
    相关资源
    最近更新 更多