【问题标题】:Extract element from vector using for loops and dataframe使用 for 循环和数据框从向量中提取元素
【发布时间】:2021-12-12 15:30:21
【问题描述】:

我检查了答案

How to extract specific element from vector using for loop in R

但这不是我想要的 我的数据包含 17 行和变量

编辑 1:我的目标是 1- 从向量中取变量名: 2-使用数据框计算向量中每个变量的总和 3-只保留每个向量中总和最大的变量 所以我有包含所有变量的数据,我的目标是让 new_data 只包含每个向量中总和最高的变量

只包含 我有一个每次使用 for 循环生成的向量,它包含变量的名称(不同的名称取决于 for 循环内的条件)

我的目标是消除每个向量中的变量名称,但总和最高的向量除外

例如我有这个数据框:

my_data >

NAMES         A       B       C    D    E      F 
One           1       2       3    4    5      6
Two           2       3       4    5    6      7
THREE         3       4       5    6    7      8
FOUR          4       5       6    7    8      9
FIVE          5       6       7    8    9     10
SIX           6       7       8    9    10    11

假设 for 循环生成的第一个向量包含名称:

vec >
 "B" "C" "D"

因此,使用这些变量,程序将消除“B”和“C”,因为 D 是总和最高的那个:

所以我会得到

New_data 

        NAMES     A    D    E      F 
        One       1    4    5      6
        Two       2    5    6      7
        THREE     3    6    7      8
        FOUR      4    7    8      9
        FIVE      5    8    9     10
        SIX       6    9    10    11

假设第二个向量包含这些名称 "A" , "E" 所以程序将消除 A,因为 E 是总和最高的变量

所以

New data >

NAMES        D    E      F 
One           4    5     6
Two           5    6     7
THREE         6    7     8
FOUR          7    8     9
FIVE          8    9     10
SIX           9    10    11

假设第三个向量包含“E”和“F”

这是我使用的向量分析程序代码的一部分:

     #This is how i generated the vector 
     vec <- names(Filter(function(x) x > 0, rowSums(tmp) > 0 |
#Vector generated by for loop 
      my_data %>%                 
        dplyr::select(all_of(vec)) %>% # select vector items
        slice(-17) %>% # remove 17 line
        map_dbl(sum) %>% # make sum
        which.max() %>% # select max
        names() -> selected # select max name
        #in the variable selected i have the name of variable i should keep
        
        my_data %>% dplyr::select(!vec,selected) -> new_data# select columns  
        
    }

这个程序的问题是最后我的 new_data 包含除了最后一个比较之外的所有变量,因为它总是使用我的数据,所以在最后一个比较中它比较我最后一个向量中的变量并将所有变量保留在new_data 中的 my_data 除了我最后一个向量中没有最高和的变量

所以继续我之前开始的例子: 假设第三个向量包含“E”和“F”:

我需要得到的结果是:

新数据 >

NAMES         D        F 
One           4        6
Two           5        7
THREE         6        8
FOUR          7        9
FIVE          8        10
SIX           9        11

#我淘汰了E,因为F的总和最高

但是我写的程序给了我这个结果:

   NAMES          A       B       C        D      F 
    One           1       2       3        5      6
    Two           2       3       4        6      7
    THREE         3       4       5        7      8
    FOUR          4       5       6        8      9
    FIVE          5       6       7        9     10
    SIX           6       7       8        10    11

我认为是因为程序从我的第一个数据中获取了信息,并且它保留了所有不在我的向量中的变量(这就是为什么在最后的比较中它保留 A B C D )

所以现在我不知道如何解决这个问题 如果您需要更多信息,请告诉我

【问题讨论】:

    标签: r for-loop select vector dplyr


    【解决方案1】:

    你可以试试这个选项 -

    for(i in vec) {
      #Get the column names to delete based on column sum
      drop_columns <- i[-which.max(colSums(my_data[i]))]
      my_data[drop_columns] <- NULL
    }
    
    #  NAMES D  F
    #1   One 4  6
    #2   Two 5  7
    #3 THREE 6  8
    #4  FOUR 7  9
    #5  FIVE 8 10
    #6   SIX 9 11
    

    数据

    my_data <- structure(list(NAMES = c("One", "Two", "THREE", "FOUR", "FIVE", 
    "SIX"), A = 1:6, B = 2:7, C = 3:8, D = 4:9, E = 5:10, F = 6:11), 
    class = "data.frame", row.names = c(NA, -6L))
    
    vec <- list(c('B', 'C', 'D'), c('A', 'E'), c('E', 'F'))
    

    【讨论】:

    • 您好,谢谢您的评论,我尝试了您的解决方案,但它没有用我删除了我的问题,所以它会让我更清楚,因为在计算总和时我不想要第 17 行正如您在我的程序中看到的那样,也可以与所有其他行一起计算
    • 您可以将 my_data[i] 替换为 my_data[-6,][i] 以跳过第 6 行(或数据中的 -17)。
    【解决方案2】:

    我不知道你在做什么,所以这里有一个替代方案。

    tmp=replicate(5,{sample(LETTERS[1:10],3)},simplify=F)
    
    [[1]]
    [1] "J" "C" "A"
    
    [[2]]
    [1] "F" "D" "B"
    
    [[3]]
    [1] "C" "G" "H"
    
    [[4]]
    [1] "J" "F" "C"
    
    [[5]]
    [1] "H" "G" "J"
    

    我组成了这些列名向量,因为我不知道你是如何生成它们的。然后我们迭代这个对象并删除列。

    for (i in tmp) {
      # your stuff here
      df=df[,!colnames(df) %in% i]
    }
    
      NAMES  E
    1   One  5
    2   Two  6
    3 THREE  7
    4  FOUR  8
    5  FIVE  9
    6   SIX 10
    

    【讨论】:

    • 我编辑了问题,请看我添加了什么
    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2021-12-05
    • 2021-05-02
    • 2018-07-28
    • 1970-01-01
    • 2023-03-28
    • 2019-02-11
    相关资源
    最近更新 更多