R 使用lappy更改数据帧列表的列名
我试图在数据帧列表上使用lappy;但是在正确传递参数方面失败了(我认为) 数据帧列表:R 使用lappy更改数据帧列表的列名,r,dataframe,lapply,R,Dataframe,Lapply,我试图在数据帧列表上使用lappy;但是在正确传递参数方面失败了(我认为) 数据帧列表: df1 <- data.frame(A = 1:10, B= 11:20) df2 <- data.frame(A = 21:30, B = 31:40) listDF <- list(df1, df2,df3) #multiple data frames w. way less columns than the length of vector todos df1试试这个:
df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40)
listDF <- list(df1, df2,df3) #multiple data frames w. way less columns than the length of vector todos
df1试试这个:
lapply (listDF, function(x) {
names(x)[-1] <- todos[-length(x)]
x
})
如果要替换所有列,也可以使用setNames
df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40)
listDF <- list(df1, df2)
new_col_name <- c("C", "D")
lapply(listDF, setNames, nm = new_col_name)
## [[1]]
## C D
## 1 1 11
## 2 2 12
## 3 3 13
## 4 4 14
## 5 5 15
## 6 6 16
## 7 7 17
## 8 8 18
## 9 9 19
## 10 10 20
## [[2]]
## C D
## 1 21 31
## 2 22 32
## 3 23 33
## 4 24 34
## 5 25 35
## 6 26 36
## 7 27 37
## 8 28 38
## 9 29 39
## 10 30 40
编辑
如果您想从列表中更改全局环境中data.frame
的列名,可以使用list2env
,但我不确定这是实现所需的最佳方法。您还需要修改列表并使用命名列表,名称应与需要替换的数据框的名称相同
listDF <- list(df1 = df1, df2 = df2)
new_col_name <- c("C", "D")
listDF <- lapply(listDF, function(df) {
names(df)[-1] <- new_col_name[-ncol(df)]
df
})
list2env(listDF, envir = .GlobalEnv)
str(df1)
## 'data.frame': 10 obs. of 2 variables:
## $ A: int 1 2 3 4 5 6 7 8 9 10
## $ C: int 11 12 13 14 15 16 17 18 19 20
listDF我无法让这些答案中使用的代码发挥作用。我从另一个论坛上找到了一些代码,这些代码确实有效。这将为每个数据帧分配新的列名,其他方法创建数据帧的副本。对于其他人,这里是代码
# Create some dataframes
df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40)
listDF <- c("df1", "df2") #Notice this is NOT a list
new_col_name <- c("C", "D") #What do you want the new columns to be named?
# Assign the new column names to each dataframe in "listDF"
for(df in listDF) {
df.tmp <- get(df)
names(df.tmp) <- new_col_name
assign(df, df.tmp)
}
#创建一些数据帧
df1不起作用,因为R是通过Valuer调用的。只需在末尾添加一个x
lappy(listDF,function(x){colnames(x)[2:length(x)]与问题无关,但我猜1:length(x)-1
是一个常见错误(有时没有害处)。右行是1:(length(x)-1)
(注意优先级!)检查输出与OP的代码。行colnames(x)[2:length(x)]
表明替换从第二列开始。@pierrelaffortune感谢Pierre你是对的,我做了一些调整sorry dickoa,但lapply只更改列表中的列名(因此df1和df2仍然具有原始列名!!)。我也尝试过添加Pierre的“x”,但仍然没有达到效果。我只使用列表来保存一个很长的DFs列表,而不是希望在列表本身内部进行更改。有什么想法吗?谢谢,您必须使用for循环,而不必使用其他函数call@user3310782查看更新后的答案,看看它是否符合您的要求。但是,我认为在这种情况下,for循环可能会更容易。感谢jogo,但是为什么它不更改数据帧列名呢?它只更改列表中的列名,而不更改独立DF中的列名。但是您可以listDF当然可以,但是如果您希望更改DF列名,那么lappy不是一种方法吗?是的,但是函数可以永远不要更改调用期间接收的值。该函数只能返回一个对象。lappy()正在为列表中的每个元素调用一个函数。
df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40)
listDF <- list(df1, df2)
new_col_name <- c("C", "D")
lapply(listDF, setNames, nm = new_col_name)
## [[1]]
## C D
## 1 1 11
## 2 2 12
## 3 3 13
## 4 4 14
## 5 5 15
## 6 6 16
## 7 7 17
## 8 8 18
## 9 9 19
## 10 10 20
## [[2]]
## C D
## 1 21 31
## 2 22 32
## 3 23 33
## 4 24 34
## 5 25 35
## 6 26 36
## 7 27 37
## 8 28 38
## 9 29 39
## 10 30 40
lapply(listDF, function(df) {
names(df)[-1] <- new_col_name[-ncol(df)]
df
})
1:10 - 1
## [1] 0 1 2 3 4 5 6 7 8 9
1:(10 - 1)
## [1] 1 2 3 4 5 6 7 8 9
listDF <- list(df1 = df1, df2 = df2)
new_col_name <- c("C", "D")
listDF <- lapply(listDF, function(df) {
names(df)[-1] <- new_col_name[-ncol(df)]
df
})
list2env(listDF, envir = .GlobalEnv)
str(df1)
## 'data.frame': 10 obs. of 2 variables:
## $ A: int 1 2 3 4 5 6 7 8 9 10
## $ C: int 11 12 13 14 15 16 17 18 19 20
# Create some dataframes
df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40)
listDF <- c("df1", "df2") #Notice this is NOT a list
new_col_name <- c("C", "D") #What do you want the new columns to be named?
# Assign the new column names to each dataframe in "listDF"
for(df in listDF) {
df.tmp <- get(df)
names(df.tmp) <- new_col_name
assign(df, df.tmp)
}