[英]How to loop through through list of data frames to set column names in R?
我有大量的數據框列表,我想根據第一列和第四行的條件設置列名。 請在下面找到我的示例數據:
sample_data<-data.frame(a= c("\"\"","This","Week","1","2", "3", "4", "5", "6" ),b=c("\"\"" , "Last" , "Week" , "(1)" , "(2)" , "(3)" , "(4)" , "(5)" , "(6)" ) ,c=c("\"\"" , "End","2008" , "<1>", "<2>", "<3>", "<4>", "<5>", "<6>" ) ,
d=c("" , "Name" , "" , "Tiger Woods" , "Sergio Garcia" ,"Phil Mickelson" ,"Padraig Harrington", "Vijay Singh" ,"Robert Karlsson") ,e=c("", "Country" , "", "United States" ,"Spain", "United States" , "Ireland" , "Fiji" , "Sweden" ),
f=c("" , "Average" , "Points" ,"11.664" , "7.992" , "6.871" , "6.832" , "6.631" , "5.017" ),f=c("", "Total" ,"Points","466.573" ,"415.591" ,"336.674", "348.431", "358.071", "265.906" ))
another_data<-data.frame(a=c("\"\"","Last", "Week" ,"\"\"","(50)", "(55)","(51)","(52)"),b=c("\"\"" ,"End", "2011","\"\"", "<148>","<70>","<49>","<51>"),c=c("","Name", "\"\"" ,"" ,"Kyle Stanley" , "Kevin Na" ,"Gonzalo Fdez-Castano" ,"Ryo Ishikawa") ,
d=c("","State","\"\"","\"\"", "United States","United States" ,"Spain" ,"Japan"),e=c("\"\"" ,"Country" ,"\"\"","\"\"","United States", "United States" ,"Spain","Japan"),f=c("\"\"","Average" ,"Points" ,"","2.694" ,"2.560","2.544" ,"2.539"))
list_df<-list(sample_data,another_data)
list_df
[[1]]
a b c d e f f.1
1 "" "" ""
2 This Last End Name Country Average Total
3 Week Week 2008 Points Points
4 1 (1) <1> Tiger Woods United States 11.664 466.573
5 2 (2) <2> Sergio Garcia Spain 7.992 415.591
6 3 (3) <3> Phil Mickelson United States 6.871 336.674
7 4 (4) <4> Padraig Harrington Ireland 6.832 348.431
8 5 (5) <5> Vijay Singh Fiji 6.631 358.071
9 6 (6) <6> Robert Karlsson Sweden 5.017 265.906
[[2]]
a b c d e f
1 "" "" "" ""
2 Last End Name State Country Average
3 Week 2011 "" "" "" Points
4 "" "" "" ""
5 (50) <148> Kyle Stanley United States United States 2.694
6 (55) <70> Kevin Na United States United States 2.560
7 (51) <49> Gonzalo Fdez-Castano Spain Spain 2.544
8 (52) <51> Ryo Ishikawa Japan Japan 2.539
所以我想要做的是檢查第四行是否包含""
。 如果是這樣,請合並數據框的第四行到第一行之間的所有內容。 另一方面,如果第四行不包含""
,則合並第三行到數據幀第一行之間的所有內容。
這是我的試驗:
for (index in 1:length(list_df))
{
if(list_df[[index]][4,1]=="")
{
list_df[[index]]<-setNames(as.data.frame(list_df[[index]][-(1:4), ]),
sapply(as.data.frame(list_df[[index]][1:4, ]), paste, collapse = ""))
}
else if(list_df[[index]][4,1]!="")
{
list_df[[index]]<-setNames(as.data.frame(list_df[[index]][-(1:3), ]),
sapply(as.data.frame(list_df[[index]][1:3, ]), paste, collapse = ""))
}
{
return(list_df)
}
}
但這並沒有給我想要的輸出。 只為第一個條件工作但不考慮第二個條件。
這是我得到的輸出:
list_df
[[1]]
ThisWeek LastWeek End2008 Name Country AveragePoints TotalPoints
4 1 (1) <1> Tiger Woods United States 11.664 466.573
5 2 (2) <2> Sergio Garcia Spain 7.992 415.591
6 3 (3) <3> Phil Mickelson United States 6.871 336.674
7 4 (4) <4> Padraig Harrington Ireland 6.832 348.431
8 5 (5) <5> Vijay Singh Fiji 6.631 358.071
9 6 (6) <6> Robert Karlsson Sweden 5.017 265.906
[[2]]
a b c d e f
1
2 Last End Name Country Country Average
3 Week 2011 Points
4
5 (50) <148> Kyle Stanley United States United States 2.694
6 (55) <70> Kevin Na United States United States 2.560
7 (51) <49> Gonzalo Fdez-Castano Spain Spain 2.544
8 (52) <51> Ryo Ishikawa Japan Japan 2.539
但是,所需的輸出如下:
list_df
[[1]]
ThisWeek LastWeek End2008 Name Country AveragePoints TotalPoints
4 1 (1) <1> Tiger Woods United States 11.664 466.573
5 2 (2) <2> Sergio Garcia Spain 7.992 415.591
6 3 (3) <3> Phil Mickelson United States 6.871 336.674
7 4 (4) <4> Padraig Harrington Ireland 6.832 348.431
8 5 (5) <5> Vijay Singh Fiji 6.631 358.071
9 6 (6) <6> Robert Karlsson Sweden 5.017 265.906
[[2]]
LastWeek End2011 Name State Country AveragePoints
5 (50) <148> Kyle Stanley United States United States 2.694
6 (55) <70> Kevin Na United States United States 2.560
7 (51) <49> Gonzalo Fdez-Castano Spain Spain 2.544
8 (52) <51> Ryo Ishikawa Japan Japan 2.539
我對此感到非常困惑。 我不知道為什么忽略了其中一個條件。 任何人都可以幫我解決這個問題嗎?
通常很容易用lapply
遍歷列表。 你可以試試 :
lapply(list_df, function(x) {
if (x[4, 1] == '""') {
names(x) = gsub('"', '', trimws(sapply(x[1:4, ], paste, collapse = "")))
x[-c(1:4), ]
}
else {
names(x) = gsub('"', '', trimws(sapply(x[1:3, ], paste, collapse = "")))
x[-c(1:3), ]
}
})
#[[1]]
# ThisWeek LastWeek End2008 Name Country AveragePoints TotalPoints
#4 1 (1) <1> Tiger Woods United States 11.664 466.573
#5 2 (2) <2> Sergio Garcia Spain 7.992 415.591
#6 3 (3) <3> Phil Mickelson United States 6.871 336.674
#7 4 (4) <4> Padraig Harrington Ireland 6.832 348.431
#8 5 (5) <5> Vijay Singh Fiji 6.631 358.071
#9 6 (6) <6> Robert Karlsson Sweden 5.017 265.906
#[[2]]
# LastWeek End2011 Name State Country AveragePoints
#5 (50) <148> Kyle Stanley United States United States 2.694
#6 (55) <70> Kevin Na United States United States 2.560
#7 (51) <49> Gonzalo Fdez-Castano Spain Spain 2.544
#8 (52) <51> Ryo Ishikawa Japan Japan 2.539
就您的for
循環而言,它不起作用的主要原因是您正在尋找錯誤的字符。 [4, 1]
處的值是""
而不是空字符串(檢查another_data[4, 1] == ''
vs another_data[4, 1] == '""'
)。 如果您更改它,您應該獲得所需的輸出。 但是,我在您的for
循環中做了一些額外的更改。
else if
條件,因為它不需要。gsub
以從列名中刪除引號return(list_df)
沒有意義,因為我們已經在for
循環中更改了list_df
,因此將其刪除。for (index in 1:length(list_df)) {
if(list_df[[index]][4,1] == '""') {
list_df[[index]]<-setNames(as.data.frame(list_df[[index]][-(1:4), ]),
gsub('"', '',sapply(as.data.frame(list_df[[index]][1:4, ]),
paste, collapse = "")))
}
else{
list_df[[index]]<-setNames(as.data.frame(list_df[[index]][-(1:3), ]),
gsub('"', '', sapply(as.data.frame(list_df[[index]][1:3, ]),
paste, collapse = "")))
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.