如何基于以某些前缀开头的一列名称值将数据帧拆分为不同的数据帧?

时间:2019-08-09 13:32:57

标签: r dataframe split

如何根据一个列名将数据帧拆分为不同的数据帧,请说## sensor_name ##值以R中的“ RI _”,“ AI_”之类的前缀开头,这样我就可以拥有两个数据帧,一个用于RI,另一个用于AI?

我已经尝试了以下代码,但是当我旋转数据框时,它会很好地工作。

  

map(set_names(c(“ RI”,“ AI”,“ FI”)),〜select(temp_df,starts_with(.x),starts_with(“ time_stamp”)))

original dataframe

我希望输出具有两个不同的数据帧,

RI_df:

enter image description here

AI_df:

enter image description here

自从我刚开始使用R编程语言以来,如果有人帮助我,那就太好了。

3 个答案:

答案 0 :(得分:1)

一个选项是split中的base R

lst1 <- split(df1, substr(df1$sensor_name, 1,2))
names(lst1)  <- paste0(names(lst1), "_df")

如果前缀长度是可变的

lst1 <- split(df1, sub("_.*", "", df1$sensor_name))

或使用tidyverse

library(dplyr)
df1 %>%
    group_split(grp = str_remove(sensor_name, "_.*"), keep = FALSE)

注意:不建议在全局环境中包含多个对象。因此,请将其保留在list中,并对该list本身进行所有分析

答案 1 :(得分:1)

base R的另一种方法

df <- data.frame(sensor_name=c("R1_111","R1_113","A1_124","A1_2444"),
            A=c(1,2,24,4),B=c(2,2,1,2),C=c(3,4,4,2))


df[grepl("R1",df$sensor_name),]

  sensor_name A B C
1      R1_111 1 2 3
2      R1_113 2 2 4


df[grepl("A1",df$sensor_name),]

  sensor_name  A B C
3      A1_124 24 1 4
4     A1_2444  4 2 2

答案 2 :(得分:0)

创建一个变量来标识每个组。之后,您可以对数据进行子集化以将组分开。字符串包中的函数可以从较长的传感器名称中提取相关文本。

library(stringr)
library(dplyr)

# Sample data

X <- tibble(
    sensor = c("RI_1", "RI_2", "AI_1", "AI_2"),
    A = c(1, 2, 3, 4),
    B = c(5, 6, 7, 8),
    C = c(9, 10, 11, 12) 
)


# Extract text to identify groups

X <- X %>% 
    mutate(prefix = str_replace(sensor, "_.*", "")) 


# Subset for desired group

X %>% filter(prefix == "AI")
# A tibble: 2 x 5
  sensor     A     B     C prefix
  <chr>  <dbl> <dbl> <dbl> <chr> 
1 AI_1       3     7    11 AI    
2 AI_2       4     8    12 AI
# Or, split all the groups

lapply(unique(X$prefix), function(x) {
    X %>% filter(prefix == x)
})

[[1]]
# A tibble: 2 x 5
  sensor     A     B     C prefix
  <chr>  <dbl> <dbl> <dbl> <chr> 
1 RI_1       1     5     9 RI    
2 RI_2       2     6    10 RI    

[[2]]
# A tibble: 2 x 5
  sensor     A     B     C prefix
  <chr>  <dbl> <dbl> <dbl> <chr> 
1 AI_1       3     7    11 AI    
2 AI_2       4     8    12 AI  

根据您对这些组的处理方式,最好使用dplyr软件包中的group_by()