首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按块每年组织的数据文件:按年添加列以合并所有数据

按块每年组织的数据文件:按年添加列以合并所有数据
EN

Stack Overflow用户
提问于 2022-09-20 21:26:00
回答 2查看 23关注 0票数 0

我在Excel中有大量的数据集,我想在R中进行分析。这些文件的格式是在同一年的每个块组织所有信息,如下所示:

代码语言:javascript
运行
复制
Group    <- c(2010, 'Group', 'A', 'B', 'C', 2011, 'Group', 'A', 'B', 'E', 2012, 'Group', 'A', 'B')
Value <- c(NA,'Value', 1, 2, 9, NA, 'Value', 3, 5, 2, NA, 'Value', 9, 1)

df <- cbind(Group, Value)
        
  Group   Value  
 1: 2010  NA     
 2: Group Value
 3: A     1    
 4: B     2    
 5: C     9    
 6: 2011  NA     
 7: Group Value
 8: A     3    
 9: B     5    
10: E     2    
11: 2012  NA     
12: Group Value
13: A     9  
14: B     1  

为了能够分析这些数据,我想自动为该年度添加一个列,以便所有数据都可以合并,如下所示:

代码语言:javascript
运行
复制
   Year Group Value  
 1: 2010  A  1       
 2: 2010  B  2
 3: 2010  C  9        
 4: 2011  A  3     
 5: 2011  B  5        
 6: 2011  E  2
 7: 2012  A  9 
 8: 2012  B  1     
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-20 21:35:05

代码语言:javascript
运行
复制
library(data.table)
dt <- data.table(df)
dt[, Year := Group[1], cumsum(is.na(Value))][Value != 'Value']

   Group Value Year
1:     A     1 2010
2:     B     2 2010
3:     C     9 2010
4:     A     3 2011
5:     B     5 2011
6:     E     2 2011
7:     A     9 2012
8:     B     1 2012

在R基地:

代码语言:javascript
运行
复制
subset(transform(df, Year = ave(Group, cumsum(is.na(Value)), FUN=\(x)x[1])), Value != 'Value')
   Group Value Year
3      A     1 2010
4      B     2 2010
5      C     9 2010
8      A     3 2011
9      B     5 2011
10     E     2 2011
13     A     9 2012
14     B     1 2012

注意,上面的列是字符。可以使用type.convert(new_df, as.is = TRUE),其中new_df是生成的df,可以将列转换为相应的类。

票数 1
EN

Stack Overflow用户

发布于 2022-09-20 21:30:09

下面是使用tidyverse的一种方法--创建'Group‘值有4位数字的’filter‘列,然后将值为'Group’的'Group‘行去掉,用前面的非NA值表示’fill‘列,用duplicated表示第一行并转换类型(type.convert)

代码语言:javascript
运行
复制
library(dplyr)
library(stringr)
library(tidyr)
 df %>%
   mutate(Year = case_when(str_detect(Group, "^\\d{4}$") ~ Group)) %>% 
   filter(Group != 'Group') %>% 
   fill(Year) %>%
   filter(duplicated(Year)) %>%
   type.convert(as.is = TRUE) %>%
   select(Year, Group, Value)

-output

代码语言:javascript
运行
复制
   Year Group Value
1 2010     A     1
2 2010     B     2
3 2010     C     9
4 2011     A     3
5 2011     B     5
6 2011     E     2
7 2012     A     9
8 2012     B     1

数据

代码语言:javascript
运行
复制
df <- data.frame(Group, Value)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73792815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档