R переименовать столбец в списке данных - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно переименовать столбец в списке данных. Имя нового столбца должно отражать имя кадра данных, к которому он принадлежит. Например, я хотел бы переименовать столбец «Письма» в «1» и «2» соответственно («Письма_1» и «Письма_2») или что-то похожее также работает.

Вот воспроизводимый пример

#Create a list containing dataframes
datasets=list()

Numbers <- c(1,2,3,4)
Letters <- c("A","B","C","D")
DF1 <- data.frame(Numbers, Letters)
Numbers <- c(1,9,3,14)
Letters <- c("A","Z","C","X")
DF2 <- data.frame(Numbers, Letters)

datasets[[1]] <- DF1
datasets[[2]] <- DF2
head(datasets[])

В этом примере создается следующая структура данных

[[1]]
  Numbers Letters
1       1       A
2       2       B
3       3       C
4       4       D

[[2]]
  Numbers Letters
1       1       A
2       9       Z
3       3       C
4      14       X

Мой желаемый результат ниже

[[1]]
  Numbers 1
1       1       A
2       2       B
3       3       C
4       4       D

[[2]]
  Numbers 2
1       1       A
2       9       Z
3       3       C
4      14       X

Вот моя попытка использовать цикл for.

# Rename column using for loop

list <- c(1,2)

for (name in list){
  colnames(datasets[[print(paste(`name`, sep=""))]][2]) <- c(print(paste(`name`, sep="")))
}

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Если вы называете свой список и хотите, чтобы в столбце Letters было добавлено имя data.frame, то это будет работать:

> Numbers <- c(1,2,3,4)
> Letters <- c("A","B","C","D")
> DF1 <- data.frame(Numbers, Letters)
> Numbers <- c(1,9,3,14)
> Letters <- c("A","Z","C","X")
> DF2 <- data.frame(Numbers, Letters)
> 
> datasets <- list(
+   DF1 = DF1,
+   DF2 = DF2
+ )
> 
> datasets <- sapply(names(datasets), function(x) {
+   df <- datasets[[x]]
+   i <- which(colnames(df) == "Letters")
+   colnames(df)[i] <- paste0("Letters_", x)
+   df
+ }, simplify = FALSE)
> 
> datasets
$DF1
  Numbers Letters_DF1
1       1           A
2       2           B
3       3           C
4       4           D

$DF2
  Numbers Letters_DF2
1       1           A
2       9           Z
3       3           C
4      14           X
0 голосов
/ 31 октября 2018

Вы можете определить имена для элементов наборов данных и затем обращаться к ним внутри цикла:

names(datasets) <- c("DF1","DF2")
for (i in 1:length(datasets))
     {
  print(names(datasets)[i])
}
[1] "DF1"
[1] "DF2"
0 голосов
/ 31 октября 2018

Вы можете использовать решение for-loop с небольшой модификацией.

for(x in seq_along(datasets))
 names(datasets[[x]])[names(datasets[[x]]) == 'Letters'] <- x 


datasets
# [[1]]
#   Numbers 1
# 1       1 A
# 2       2 B
# 3       3 C
# 4       4 D
# 
# [[2]]
#   Numbers 2
# 1       1 A
# 2       9 Z
# 3       3 C
# 4      14 X
0 голосов
/ 31 октября 2018

Мы можем перебрать каждый элемент списка и переименовать только те столбцы, в которых есть «Буквы», используя setNames

datasets[] <- lapply(seq_along(datasets), function(x) 
                     setNames(datasets[[x]], 
                  replace(names(datasets[[x]]), names(datasets[[x]]) == "Letters", x)))



datasets
#[[1]]
#   Numbers        1
#1        1        A
#2        2        B
#3        3        C
#4        4        D

#[[2]]
#   Numbers        2
#1        1        A
#2        9        Z
#3        3        C
#4       14        X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...