我檢查了答案
如何使用R中的for回圈從向量中提取特定元素
但這不是我想要的我的資料包含 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 回圈生成的第一個向量包含 names :
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 包含除最后一次比較之外的所有變數,因為它總是使用我的資料,所以在最后一次比較中它比較我最后一個向量中的變數,并將 my_data 中的所有變數保留在 new_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
我認為是因為程式從我的第一個資料中獲取資訊,并保留所有不在我的向量中的變數(這就是為什么在最后一次比較中它保留 ABCD )
所以現在我不知道如何解決這個問題,請告訴我您是否需要更多資訊
uj5u.com熱心網友回復:
你可以試試這個選項——
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'))
uj5u.com熱心網友回復:
我不知道你在做什么,所以這里有一個替代方案。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/338788.html
下一篇:Na填充特定值后
