簡體   English   中英

R:使用dplyr突變多個列

[英]R: Using dplyr to Mutate Multiple Columns

關於堆棧溢出有很多與此有關的問題,但是我一直無法找到解決問題的方法。

假設我有一個包含兩列的數據幀(或小標題) df ,例如X1X2 我有一個函數f ,它接受輸入X1X2並輸出一個向量 [V1, V2] 現在,如果輸出是單例,那么我將能夠寫

df %>% mutate(V = f(X1,X2))

將標記為V的列添加到我的df ,條目將為f(X1,X2) 但是,我想添加V1V2 我不知道該怎么做。

當然,我可以做類似的事情

df %>% mutate(V1 = f(X1,X2)[1], V2 = f(X1,X2)[2]),

但這(我假設)涉及到兩次調用函數f 我有一個很大的數據集,寧願不叫它兩次。 或者,我可以做

df %>% mutate(V_list = as.list(f(X1,X2)), V1 = V_list[[1]], V2 = V_list[[2]]) %>% select(-V_list),

但這似乎是一種笨拙的方式,而我寧願不這樣做。

此外,我最終希望將其應用於group ed tibble,因此,天真的編寫方法將為組中的每個條目復制V_list 因此,從以下意義上講,理想的答案是“矢量化的”。 假設我已經完成了df %>% group_by(var1)並具有一個函數f ,該函數將一個包含兩列的數據框作為輸入-這應該被視為“成對向量”-然后輸出一個新數據兩列的框架。


這是一些設置示例的代碼。

library(dplyr)
df = tibble(var1 = c(1,1,2,2), X1 = c(1,2,3,4), X2 = c(5,6,7,8))
f = function(sub_df, var){ return( data.frame(x1 = (x1+x2)^var, x2 = (x1-x2)^var) ) }

使用tidyr 1.0.0,您可以使用unnest_wider

修改函數,以便將輸出命名為

f = function(x1,x2) c(a = x1 + x2, b = x1 - x2)

創建一個新列,該列是一個包含每行向量的列表,然后將unnest_wider應用於此列,以將向量元素拆分為自己的列。

df %>%
  mutate(new = map2(X1, X2, f)) %>%
  unnest_wider(new)
# # A tibble: 4 x 5
#    var1    X1    X2     a     b
#   <dbl> <dbl> <dbl> <dbl> <dbl>
# 1     1     1     5     6    -4
# 2     1     2     6     8    -4
# 3     2     3     7    10    -4
# 4     2     4     8    12    -4

這可能不是理想的解決方案,但是我已經遇到了這種情況,這是我通常要做的。 從函數返回一個分隔符分隔的字符串和separate基於該定界符的列。

f = function(x1,x2){ return( toString(c(x1+x2, x1-x2))) }

library(tidyverse)

df %>%
  mutate(new = map2_chr(X1, X2, f)) %>%
  separate(new, c("col1", "col2"), sep = ",", convert = TRUE)

# A tibble: 2 x 4
#     X1    X2  col1  col2
#  <dbl> <dbl> <int> <int>
#1     1     3     4    -2
#2     2     4     6    -2

暫無
暫無

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

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