我正在嘗試使用兩個 for 回圈
- 將一些 csv 檔案匯入資料框和
- 將我的自制功能應用于那些匯入的資料框。
我搜索了分配和獲取功能,第一步(將csv匯入df)作業......
Lines <- c(101, 102, 103, 301, 311, 312, 514, 617, 706, 918)
for (i in 1:length(Lines)) {
assign("dfName", paste0(("df_Line"),Lines[i]))
assign("lineName", paste0(("LineNum_"),Lines[i],(".csv")))
dfName <- read.csv(lineName, encoding="UTF-8")
}
此代碼有效,并將 LineNum_101.csv 作為我想要的 df_Line101 從 101 帶到 918。
所以我繼續嘗試應用'function_Merged(df)'(我制作的那個。它在這個問題頁面的末尾),它應該使'df_Line101'到'df_101_Merged',從101到918。但是這個回圈有什么問題?
Lines <- c(101, 102, 103, 301, 311, 312, 514, 617, 706, 918)
for (i in 1:length(Lines)) {
assign("dfName", paste0(("df_Line"),Lines[i]))
assign("dfMerged", paste0(("df_"),Lines[i],("_Merged")))
dfMerged <- function_Merged(dfName)
}
它說“錯誤:$ 運算子對原子向量無效”。
好吧,我在沒有回圈的情況下檢查了變數本身,并且
assign("dfName", paste0(("df_Line"),Lines[1]))
assign("dfMerged", paste0(("df_"),Lines[1],("_Merged")))
print(dfName)
print(dfMerged)
分別給了我 [1] "df_Line101" 和 [1]"df_101_Merged"。
我試圖用這兩個賦值來應用我的函式。我已經嘗試了很多很多東西,現在我不知道。
get(dfMerged) <- function_Merged(get(dfName))
給了我[找不到函式“get<-”]
get(dfMerged) <- function_Merged(dfName)
game ve [$ 運算子對原子向量無效]
dfMerged <- function_Merged(get(dfName))
有……是的。它制作了一個名為 dfMerged 的??全新框架。function_Merged 雖然有效。
我應該怎么做才能使這個for回圈作業?任何幫助或建議都會非常有用。謝謝!
22/05/24 可重現版本(?idk)
首先是我使用的庫(我知道其中許多實際上不會在此代碼中使用,但無論如何)
library(ggplot2)
library(dplyr)
library(ggpmisc)
library(plotrix)
library(tidyverse)
library(lubridate)
library(ggrepel)
library(broom)
library(plotly)
library(reprex)
library(readxl)
library(zoo)
library(pracma)
我的作業目錄中有大約 100 個 CSV 檔案。檔案名的格式為“LineNum_(number).csv”
list.files()
'0523_visualize.ipynb''LineNum_101.csv''LineNum_102.csv''LineNum_103.csv''LineNum_104.csv''LineNum_105.csv''LineNum_106.csv''LineNum_107.csv''LineNum_108.csv''LineNum_113.csv''LineNum_114.csv''LineNum_115.csv''LineNum_116.csv''LineNum_117.csv''LineNum_119.csv''LineNum_121.csv''LineNum_201.csv''LineNum_202.csv''LineNum_203.csv''LineNum_211.csv''LineNum_212.csv''LineNum_213.csv''LineNum_216.csv''LineNum_301.csv''LineNum_311.csv''LineNum_312.csv''LineNum_313.csv''LineNum_314.csv''LineNum_315.csv''LineNum_316.csv''LineNum_317.csv''LineNum_318.csv''LineNum_501.csv''LineNum_511.csv''LineNum_512.csv''LineNum_513.csv''LineNum_514.csv''LineNum_601.csv''LineNum_602.csv''LineNum_603.csv''LineNum_604.csv''LineNum_605.csv''LineNum_606.csv''LineNum_607.csv''LineNum_608.csv''LineNum_611.csv''LineNum_612.csv''LineNum_613.csv''LineNum_614.csv''LineNum_615.csv''LineNum_616.csv''LineNum_617.csv''LineNum_618.csv''LineNum_619.csv''LineNum_620.csv''LineNum_622.csv''LineNum_701.csv''LineNum_703.csv''LineNum_704.csv''LineNum_705.csv''LineNum_706.csv''LineNum_711.csv''LineNum_712.csv''LineNum_802.csv''LineNum_911.csv''LineNum_912.csv''LineNum_916.csv''LineNum_918.csv'
每個檔案如下所示:
df_Line311 <-read.csv("LineNum_311.csv", encoding = "UTF-8")
head(df_Line311, 5)
A data.frame: 5 × 5
Date On Off Transfer LineNum
<chr> <int> <int> <int> <int>
1 2020-01-02 15623 12250 3288 311
2 2020-01-03 16598 13078 3410 311
3 2020-01-04 12081 9771 2296 311
4 2020-01-05 9543 7556 1835 311
5 2020-01-06 14779 11607 3321 311
df_Line101 <-read.csv("LineNum_101.csv", encoding = "UTF-8")
head(df_Line101,5)
A data.frame: 5 × 5
Date On Off Transfer LineNum
<chr> <int> <int> <int> <int>
1 2020-01-02 4250 3725 1061 101
2 2020-01-03 4463 3910 1099 101
3 2020-01-04 3214 2847 753 101
4 2020-01-05 2977 2562 660 101
5 2020-01-06 4197 3673 1041 101
... 等等。
這里的On/Off/Transfer變數是上車/下車/轉移到公交線路LineNum的人數。例如20-01-02,15623人乘坐了311路公交車。
現在我正在通過三個步驟處理資料:
- 僅獲取作業日(周二、周三、周四)資料
function_Workdays <- function(dataframe) {
tempDF <- dataframe
tempDF$Date <- as.Date(tempDF$Date)
tempDF$Days <- weekdays(tempDF$Date)
tempDF$Workdays <- factor(tempDF$Days %in% c("???", "???", "???") )
# ???, ???, ??? means Tue, Wed, Thu each in Korean
tempDF <- subset(tempDF, Workdays==T)
return(tempDF)
rm(tempDF)
}
df_Line311_Workdays <- function_Workdays(df_Line311)
head(df_Line311_Workdays, 5)
A data.frame: 5 × 7
Date On Off Transfer LineNum Days Workdays
<date> <int> <int> <int> <int> <chr> <fct>
1 2020-01-02 15623 12250 3288 311 ??? TRUE
6 2020-01-07 14779 11510 3125 311 ??? TRUE
7 2020-01-08 15571 12315 3433 311 ??? TRUE
8 2020-01-09 15828 12773 3383 311 ??? TRUE
13 2020-01-14 15620 12721 3354 311 ??? TRUE
- 將“stats”包中的正在運行的媒體函式(RunMed)應用于On值以進行平滑處理
function_Runmed <- function(dataframe) {
tempDF <- dataframe
tempDF$On_RunMed <- runmed(tempDF$On, 7)
return(tempDF)
rm(tempDF)
}
df_Line311_Runmed <- function_Runmed(df_Line311_Workdays)
head(df_Line311_Runmed, 5)
Date On Off Transfer LineNum Days Workdays On_RunMed
<date> <int> <int> <int> <int> <chr> <fct> <dbl>
1 2020-01-02 15623 12250 3288 311 ??? TRUE 15571
6 2020-01-07 14779 11510 3125 311 ??? TRUE 15571
7 2020-01-08 15571 12315 3433 311 ??? TRUE 15571
8 2020-01-09 15828 12773 3383 311 ??? TRUE 15604
13 2020-01-14 15620 12721 3354 311 ??? TRUE 15571
- 在 stats 包中也應用 Loess 函式
function_Loess <- function(dataframe) {
tempDF <- dataframe
tempDF$NumericDate = as.numeric(tempDF$Date)
LoessFunction <-
stats::loess(On_RunMed ~ NumericDate, data = tempDF, span = 0.1)
LoessFunction_value <- predict(LoessFunction, se=T)
Loess_Function_df <- data.frame(LoessFunction_value)
tempDF$Loess_Fit <- Loess_Function_df$fit
tempDF$Loess_SE <- Loess_Function_df$se.fit
return(tempDF)
rm(tempDF)
}
df_Line311_Runmed_Loess <- function_Loess(df_Line311_Runmed)
head(df_Line311_Runmed_Loess, 5)
A data.frame: 5 × 11
Date On Off Transfer LineNum Days Workdays On_RunMed NumericDate Loess_Fit Loess_SE
<date> <int> <int> <int> <int> <chr> <fct> <dbl> <dbl> <dbl> <dbl>
1 2020-01-02 15623 12250 3288 311 ??? TRUE 15571 18263 15115.58 293.1331
6 2020-01-07 14779 11510 3125 311 ??? TRUE 15571 18268 15437.50 210.3811
7 2020-01-08 15571 12315 3433 311 ??? TRUE 15571 18269 15484.75 197.0860
8 2020-01-09 15828 12773 3383 311 ??? TRUE 15604 18270 15526.54 184.9781
13 2020-01-14 15620 12721 3354 311 ??? TRUE 15571 18275 15656.93 143.0892
我合并了這三個...
function_Merged <- function(dataframe) {
df_Workdays <- function_Workdays(dataframe)
df_Runmed <- function_Runmed(df_Workdays)
df_Loess <- function_Loess(df_Runmed)
return(df_Loess)
}
df_311_Merged <- function_Merged(df_Line311)
head(df_311_Merged, 5)
A data.frame: 5 × 11
Date On Off Transfer LineNum Days Workdays On_RunMed NumericDate Loess_Fit Loess_SE
<date> <int> <int> <int> <int> <chr> <fct> <dbl> <dbl> <dbl> <dbl>
1 2020-01-02 15623 12250 3288 311 ??? TRUE 15571 18263 15115.58 293.1331
6 2020-01-07 14779 11510 3125 311 ??? TRUE 15571 18268 15437.50 210.3811
7 2020-01-08 15571 12315 3433 311 ??? TRUE 15571 18269 15484.75 197.0860
8 2020-01-09 15828 12773 3383 311 ??? TRUE 15604 18270 15526.54 184.9781
13 2020-01-14 15620 12721 3354 311 ??? TRUE 15571 18275 15656.93 143.0892
對于最后一步,我希望所有這些 csv 檔案都位于資料框中的作業目錄中,并以相同的 df 名稱形式應用此合并函式(當然是自動的。這就是讓我嘗試在 for 回圈中分配和獲取函式的原因)
感謝我得到的答案,使用資料框串列而不是那些分配獲取的東西要容易得多。我成功地 brougut 所有的 csv 檔案并將我的合并函式應用于它們。
my_list <- c("LineNum_101.csv", "LineNum_102.csv", "LineNum_103.csv")
my_df = lapply(my_list, function(x) read.csv(x, encoding = "UTF-8") )
lapply(my_df, function(x) function_Merged(x))
summary(my_df)
Length Class Mode
[1,] 5 data.frame list
[2,] 5 data.frame list
[3,] 5 data.frame list
my_df[1]
A data.frame: 786 × 5
Date On Off Transfer LineNum
<chr> <int> <int> <int> <int>
2020-01-02 4250 3725 1061 101
2020-01-03 4463 3910 1099 101
2020-01-04 3214 2847 753 101
2020-01-05 2977 2562 660 101
2020-01-06 4197 3673 1041 101
但我需要這些資料框在應用合并函式后從串列中取出以擁有自己的資料框名稱。我怎樣才能做到這一點?有沒有辦法用自動名稱匯出串列中的每個資料框?(我希望我的串列元素的名稱為 df_101_Merged、df_102_Merged、……等等。)嗯……我可以對每個 df 中的 LineNum 資料做些什么嗎?
uj5u.com熱心網友回復:
您沒有提供可重現的示例,但我將編造一些資料并展示使用串列比使用assign和更好get。
## each is just mtcars
my_files = c("mtcars.1.txt", "mtcars.2.txt", "mtcars.3.txt")
我們可以像這樣創建一個list資料框:
my_list = lapply(my_files, function(x) read.table(x, sep=","))
[[1]]
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 mpg cyl disp hp drat wt qsec vs am gear carb
2 21 6 160 110 3.9 2.62 16.46 0 1 4 4
3 21 6 160 110 3.9 2.875 17.02 0 1 4 4
4 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
5 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
6 18.7 8 360 175 3.15 3.44 17.02 0 0 3 2
7 18.1 6 225 105 2.76 3.46 20.22 1 0 3 1
8 14.3 8 360 245 3.21 3.57 15.84 0 0 3 4
9 24.4 4 146.7 62 3.69 3.19 20 1 0 4 2
[ reached 'max' / getOption("max.print") -- omitted 24 rows ]
[[2]]
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 mpg cyl disp hp drat wt qsec vs am gear carb
2 21 6 160 110 3.9 2.62 16.46 0 1 4 4
3 21 6 160 110 3.9 2.875 17.02 0 1 4 4
4 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
5 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
6 18.7 8 360 175 3.15 3.44 17.02 0 0 3 2
7 18.1 6 225 105 2.76 3.46 20.22 1 0 3 1
8 14.3 8 360 245 3.21 3.57 15.84 0 0 3 4
9 24.4 4 146.7 62 3.69 3.19 20 1 0 4 2
[ reached 'max' / getOption("max.print") -- omitted 24 rows ]
[[3]]
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 mpg cyl disp hp drat wt qsec vs am gear carb
2 21 6 160 110 3.9 2.62 16.46 0 1 4 4
3 21 6 160 110 3.9 2.875 17.02 0 1 4 4
4 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
5 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
6 18.7 8 360 175 3.15 3.44 17.02 0 0 3 2
7 18.1 6 225 105 2.76 3.46 20.22 1 0 3 1
8 14.3 8 360 245 3.21 3.57 15.84 0 0 3 4
9 24.4 4 146.7 62 3.69 3.19 20 1 0 4 2
[ reached 'max' / getOption("max.print") -- omitted 24 rows ]
然后假設我們想將一個函式應用于所有資料幀——我們可以定義一個函式并使用lapply它來將它應用于串列中的所有資料幀。在這種情況下,讓我們從每個資料幀中抽取 2 行。
random_function = function(x, n) {
sample_n(x, n)
}
my_list = lapply(my_list, function(x) random_function(x, n=2))
[[1]]
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 32.4 4 78.7 66 4.08 2.2 19.47 1 1 4 1
2 15.5 8 318 150 2.76 3.52 16.87 0 0 3 2
[[2]]
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 10.4 8 472 205 2.93 5.25 17.98 0 0 3 4
2 13.3 8 350 245 3.73 3.84 15.41 0 0 3 4
[[3]]
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
2 13.3 8 350 245 3.73 3.84 15.41 0 0 3 4
要命名結果串列,我們可以使用names()如下:
## obviously change this based on how you want to name the list
library(stringr)
names(my_list) = str_remove_all(my_files, "\\.txt")
我希望你能適應你的資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481518.html
