簡體   English   中英

將動態列名傳遞給transform()R函數

[英]Pass dynamic column name to transform() R function

我有一個包含多列的數據框,我想在循環運行時將動態列名傳遞給R transform()函數。 請求

例如

df1 <- data.frame(col1=c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),
                  col2=c("id1", "id1", "id1", "id1", "id1", "id1", "id2", "id3", "id3", "id4", "id4", "id4", "id5", "id6", "id7", "id7"), 
                  col3=c(1, 1, 1, 2, 3, 4, 2, 4, 2, 1, 4, 5, 1, 1, 2, 3),
                  col4=c(3, 2, 2, 2, 2, 1, 1, 1, 3, 3, 3, 1, 1, 1, 3, 3))


newColN <- "newCol"
colName <- "col3"

transform(df1, newColN = ~colName)

transform()的第二個參數應采用動態列名作為我傳遞的函數的名稱。

我嘗試了以下

transform(df1, as.name(newColN) = -(as.name(colName)))

transform(df1, !!newColN := -(!!colName)
+ )

transform(df1, !!as.name(newColN) := -(!!as.name(colName)))

但看到一個錯誤。

任何有效實現這一目標的建議將不勝感激。

如果您要執行此操作,則transform實際上不是正確的工具。 建議您改用以下任何一種方法

replace(df1, newColN, -df1[[colName]])

df2 <- df1
df2[[newColN]] <- - df2[[colName]]

within(df1, assign(newColN, - df1[[colName]]))

within(df1, assign(newColN, - get(colName)))

如果您不需要在左側動態定義變量,則transform仍然可以進行:

transform(df1, newCol = - df1[[colName]])

transform(df1, newCol = - environment()[[colName]])

transform(df1, newCol = - get(colName))

你可能想改變你的transform ,以mutatedplyr使用它會更簡單,以執行這樣的操作。

library(dplyr)
library(rlang)

df1 %>% mutate(!!newColN := get(colName))

#   col1 col2 col3 col4 newCol
#1     1  id1    1    3      1
#2     2  id1    1    2      1
#3     3  id1    1    2      1
#4     4  id1    2    2      2
#5     5  id1    3    2      3
#6     6  id1    4    1      4
#7     7  id2    2    1      2
#8     8  id3    4    1      4
#9     9  id3    2    3      2
#10   10  id4    1    3      1
#11   11  id4    4    3      4
#12   12  id4    5    1      5
#13   13  id5    1    1      1
#14   14  id6    1    1      1
#15   15  id7    2    3      2
#16   16  id7    3    3      3

或使用sym

df1 %>%  mutate(!!newColN := !!sym(colName))

暫無
暫無

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

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