簡體   English   中英

在 R 中用循環替換列名

[英]Replacing Column Name with Loop in R

我有三個 df P1、P2、P3,每三列。 我想通過循環將每個 df 的第二列更改為 D1、D2、D3,但沒有任何效果。 我錯過了什么?

C1 <- c(12,34,22)
C2 <- c(43,86,82)
C3 <- c(98,76,25)

C4 <- c(12,34,22)
C5 <- c(43,86,82)
C6 <- c(98,76,25)

C7 <- c(12,34,22)
C8 <- c(43,86,82)
C9 <- c(98,76,25)

P1 <- data.frame(C1,C2,C3)
P2 <- data.frame(C4,C5,C6)
P3 <- data.frame(C7,C8,C9)

x <- c("P1", "P2", "P3")
b <- c("D1","D2","D3")

for (V in b){
  names(x)[2] <- "V"
}

我期望的 output 是:

P1 <- data.frame(C1,D1,C3)
P2 <- data.frame(C4,D2,C6)
P3 <- data.frame(C7,D3,C9)

我們可以使用mget獲取list中字符串向量的值,使用Map將第二列每個list元素重命名為相應的 'b' 值,然后使用list2env更新全局環境中的那些對象

list2env(Map(function(x, y) {names(x)[2] <- y; x}, mget(x), b), .GlobalEnv)

-輸出

P1
#  C1 D1 C3
#1 12 43 98
#2 34 86 76
#3 22 82 25

P2
#  C4 D2 C6
#1 12 43 98
#2 34 86 76
#3 22 82 25
P3
#  C7 D3 C9
#1 12 43 98
#2 34 86 76
#3 22 82 25

為了理解代碼,第一步是對字符串向量進行mget

mget(x)

返回 data.frame list

然后,我們將其作為參數傳遞給Map以及相應的“b”向量。 list的每個元素都是一個單位,類似地vector的每個元素都是一個單位

Map(function(x, y) x, mget(x), b)

function(x, y)是匿名/lambda function 結構。 使用它,我們將第二列的names設置為“b”的名稱。 這里,“b”的匿名參數是“y”。 稍后,我們將所有內容包裝在list2env中,因為它是一個命名list ,它將在全局環境中查找這些名稱以更新它

通常最好使用此類事物的列表。 這可以讓生活更輕松,通常是一個很好的學習工作流程。

list1 <- list(P1 = P1, P2 = P2, P3 = P3)

# here is your loop
for (i in seq_along(list1)) {
  names(list1[[i]])[2] <- b[i]
}

# you can use Map as well for iteration, similar to @akrun's solution
# this is really identical at this point, except you've created the list differently
Map(function(df, b) {names(df)[2] <- b; df}, list1, b)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM