我有一個列名串列,我的目的是運行一個 for 回圈來獲取每列的資訊,以便以后使用它。
例如,想象一下我有這個資料框:
> mtcars
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
我只想處理一些列。所以,我用我想要的列創建了一個向量:
MyList <- c("mpg", "cyl")
因此,對于每一列,我想計算最小值和最大值。(我想用代碼創建一個函式)。
我創建了這個函式,但它不起作用,因為它不能識別列本身。
my_func <- function(DF, MyList){
for(element in MyList){
print(DF$element) # it doesn't work
print(c(min(DF$element), max(DF$element))) # it doesn't work
}
}
#Calling the function
my_func(DF=mtcars, MyList = Mylist)
我得到的:
NULL
[1] Inf -Inf
NULL
[1] Inf -Inf
Warning messages:
1: In min(DF$element) : no non-missing arguments to min; returning Inf
2: In max(DF$element) : no non-missing arguments to max; returning -Inf
3: In min(DF$element) : no non-missing arguments to min; returning Inf
4: In max(DF$element) : no non-missing arguments to max; returning -Inf
我知道我可以dplyr::select(DF, element)用來選擇我想要的列,但是,雖然我將它保存在一個變數中,但我無法繼續下一步(計算最小值和最大值)。
我想要這樣的東西 * 但我在串列中的每一列都有)
print(c(min(mtcars$mpg), max(mtcars$mpg)))
[1] 10.4 33.9
有人可以幫我解決這個問題嗎?
首先十分感謝
問候
uj5u.com熱心網友回復:
你可以使用across并從那里你可以根據自己的喜好重塑:
mtcars %>%
summarize(across(c(MyList), list(min = min, max = max), .names = "{.col}_{.fn}"))
這使:
mpg_min mpg_max cyl_min cyl_max
1 10.4 33.9 4 8
或者:
mtcars %>%
summarize(across(c(MyList), list(min = min, max = max), .names = "{.col}_{.fn}")) %>%
pivot_longer(everything(), names_to = c("column", "stat"), names_sep = "_")
這使:
# A tibble: 4 x 3
column stat value
<chr> <chr> <dbl>
1 mpg min 10.4
2 mpg max 33.9
3 cyl min 4
4 cyl max 8
uj5u.com熱心網友回復:
也許:
library(tidyverse)
map(MyList, ~ mtcars %>% select(.x) %>%
summarise(across(everything(), list(~min(.), ~max(.)))))
# [[1]]
# mpg_1 mpg_2
# 1 10.4 33.9
# [[2]]
# cyl_1 cyl_2
# 1 4 8
uj5u.com熱心網友回復:
試試這個,它對我有用
library(tidyr)
mtcars %>%
select(mpg,cyl) %>%
summarize(min_mpg=min(mpg),
max_mpg=max(mpg),
min_cyl=min(cyl),
max_cyl=max(cyl))
uj5u.com熱心網友回復:
一種方法是撰寫一個函式來回傳向量的最小值和最大值:
myMinMax <- function(x)(c('min'=min(x),'max'=max(x)))
然后將?apply其發送到您感興趣的列,即mtcars[,MyList].
apply(mtcars[,MyList], 2, myMinMax)
mpg cyl
min 10.4 4
max 33.9 8
tidyverse 解決方案可能更具可讀性:
library(tidyverse)
mtcars %>% select(MyList) %>% summarise(across(MyList, list('min'=min, 'max'=max)))
您還可以混合搭配這兩種方法:
mtcars %>% select(MyList) %>% summarise(across(MyList, myMinMax))
uj5u.com熱心網友回復:
由于某種原因$在 for 回圈中不起作用,所以我找到的解決方案是:
my_func <- function(DF, MyList){
for(element in MyList){
print(DF[,element])
print(c(min(DF[,element]), max(DF[,element])))
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/354155.html
上一篇:將表轉換為資料框R
下一篇:使用R從字串中提取字符和數字
