R:为了编译来自多个源的数据,我如何基于排名条件重命名列?

ogq8wdun  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(126)

我遇到了一个问题,我编译数据集从多个来源,其中他们有相同类型的数据,我需要的,但列名不同!所以我试图找出如何编译所有这些数据在一个单一的函数,我可以选择我想要的列名基于排名系统,因为列名不同,我想包括。
虽然我不知道如何为这个特定的问题创建一个合适的可重复的例子,但我想出了这个数据集,它包含三个变量相似但名称不同的 Dataframe ,目标是创建一个排名系统,为它选择(或重命名)变量。
作为示例,如果数据集1具有Temp 1、Temp 2、Temp 3和Temp 4;dataset 2有T_1_1_1、T_1_1_2、T_1_1_3和T_1_1_4,我想先选择“Temp 1”和“T_1_1_1”。假设其他数据集可能有这些或其他变量名称的混合(将有多个以“T”开头的变量)。
我正在编译来自100多个数据集的数据,所以可变性是我面临的一个问题。
更具体地说,我想创建某种排序系统来选择列名,基于下面的示例:
选择最接近T_1_1_1的值,首先从变量中选择,格式如下:第1_1次植入、第1_2次植入、第1_3次植入、第1_4次植入、第1_5次植入
选择最接近Temp 1的值,首先使用以下格式的变量:温度1、温度2、温度3、温度4
使用以下格式首先从变量中选择最接近P的值:第1页、第1页、第2页、第3页、第4页、第5页、第6页、第7页
选择最接近P_FI_1的值,首先从变量中选择,格式如下:P_FI_1、P_FI_2、P_FI_3、P_FI_4、P_FI_5、P_FI_6、P_FI_7、
我想我需要dplyr中的一些内容,其中rename_at()带有any_of()(如下所示:https://dplyr.tidyverse.org/reference/rename.html),但我不确定如何让它对我的特定问题起作用。
任何帮助将不胜感激!

library(dplyr)

#Dataset 1
dataset1 <- as_tibble(iris) # so it prints a little nicer

#goal: have it pull Temp1, P3, S2_1 out of all possible options
dataset1$Temp1 <- sample(50, size = nrow(dataset1), replace = TRUE)
dataset1$Temp2 <- sample(50, size = nrow(dataset1), replace = TRUE)
dataset1$Temp3 <- sample(50, size = nrow(dataset1), replace = TRUE)
dataset1$Temp4 <- sample(50, size = nrow(dataset1), replace = TRUE)

dataset1$P6 <- sample(50, size = nrow(dataset1), replace = TRUE)
dataset1$P7 <- sample(50, size = nrow(dataset1), replace = TRUE)
dataset1$P3 <- sample(50, size = nrow(dataset1), replace = TRUE)
dataset1$P4 <- sample(50, size = nrow(dataset1), replace = TRUE)

#Dataset #2
dataset2 <- as_tibble(iris) # so it prints a little nicer

#goal: have it pull T_1_1, P_FI_3, S_1_6 out of all possible options
dataset2$T_1_1 <- sample(50, size = nrow(dataset2), replace = TRUE)
dataset2$T_1_2 <- sample(50, size = nrow(dataset2), replace = TRUE)
dataset2$T_1_3 <- sample(50, size = nrow(dataset2), replace = TRUE)
dataset2$T_1_4 <- sample(50, size = nrow(dataset2), replace = TRUE)

dataset2$P_FI_6 <- sample(50, size = nrow(dataset2), replace = TRUE)
dataset2$P_FI_7 <- sample(50, size = nrow(dataset2), replace = TRUE)
dataset2$P_FI_3 <- sample(50, size = nrow(dataset2), replace = TRUE)
dataset2$P_FI_4 <- sample(50, size = nrow(dataset2), replace = TRUE)

#Dataset #3
dataset3 <- as_tibble(iris)

#goal: have it pull T_1_2, P, S out of all possible options
dataset3$T_1_2 <- sample(50, size = nrow(dataset3), replace = TRUE)
dataset3$T_1_3 <- sample(50, size = nrow(dataset3), replace = TRUE)
dataset3$T_1_4 <- sample(50, size = nrow(dataset3), replace = TRUE)
dataset3$T_1_5 <- sample(50, size = nrow(dataset3), replace = TRUE)

dataset1$P <- sample(50, size = nrow(dataset1), replace = TRUE)
dataset1$P7 <- sample(50, size = nrow(dataset1), replace = TRUE)
dataset1$P6 <- sample(50, size = nrow(dataset1), replace = TRUE)
dataset1$P4 <- sample(50, size = nrow(dataset1), replace = TRUE)

#Goals - I want something like this for the end result. It can be rename or subset, whatever is easiest. 

 #I'm not sure how to create a ranking system for the column names to select from but I'm thinking something like this:
    #Select values closest to T_1_1_1 first out of variables with this format
    #T_1_1 
    #T_1_2 
    #T_1_3 
    #T_1_4 
    #T_1_5 
    
    #Select values closest to Temp1 first out of variables with this format
    #Temp1 
    #Temp2 
    #Temp3 
    #Temp4 
    
    #Select values closest to P first out of variables with this format
    #P
    #P1
    #P2
    #P3 
    #P4 
    #P5
    #P6 
    #P7 
    
    #Select values closest to P_FI_1 first out of variables with this format
    #P_FI_1
    #P_FI_2 
    #P_FI_3 
    #P_FI_4 
    #P_FI_5
    #P_FI_6 
    #P_FI_7    

#goal: have it pull Temp1, P3 out of all possible options
colnames(dataset1)
dataset1$Temperature <- dataset1$Temp1 
dataset1$Precipitation <- dataset1$P3 
colnames(dataset1)

#goal: have it pull T_1_1, P_FI_3 out of all possible options
colnames(dataset2)
dataset2$Temperature <- dataset2$T_1_1 
dataset2$Precipitation <- dataset2$P_FI_3 
colnames(dataset2)

#goal: have it pull T_1_2, P out of all possible options
colnames(dataset3)
dataset3$Temperature <- dataset3$T_1_2 
dataset3$Precipitation <- dataset3$P 
colnames(dataset3)
lp0sw83n

lp0sw83n1#

下面是一个使用几个类别的概念证明。我的方法是获取列名,应用一些逻辑对它们进行分类,然后为每个类别选择字母表中的第一个。
有些类别有重叠的性质,所以对于case_when,你会想从最具体的开始,即在你寻找“P”之前寻找“P_”,因为只有第一个会得到“P_1”,而第二个会同时包括“P1”和“P_1”。具体是一个实现细节,你将处于更好的位置来弄清楚,但我希望这能给你指明方向。
在这个例子中,我使用了问题初稿中的一些类别,我没有选择“P”类别,在这个类别中,你可以使用正则表达式或其他标准来排除花瓣长度,尽管它是以P开头的。

subset_df <- function(df) {
  colnames_df = data.frame(colname = colnames(df)) %>%
    mutate(category = case_when(
      colname %>% str_starts("Temp") ~ "Temp",
      colname %>% str_starts("S_") ~ "S_",
      colname %>% str_starts("S") & colname %>% str_detect("_") ~ "S1_",
      colname %>% str_starts("S") ~ "S",
      TRUE ~ "other"
    )) %>%
    arrange(colname) %>%
    slice(1, .by = category)

  df %>% select(any_of(colnames_df$colname))
  
}

subset_df(dataset1)
# outputs columns "P" "S2_1"  "Sepal.Length" "Temp1"       
subset_df(dataset2)
# outputs columns "P_FI_3" "S_1_6"  "Sepal.Length"
subset_df(dataset3)
# outputs columns "Petal.Length" "S"   "S_2_1"

相关问题