Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用lappy更改数据帧列表的列名_R_Dataframe_Lapply - Fatal编程技术网

R 使用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试试这个:

我试图在数据帧列表上使用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试试这个:

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)
}