簡體   English   中英

根據列名將函數傳遞給多個列

[英]Passing function to multiple columns based on column name

我有一個數據框(DF),具有3列的值和200列的僅標題和NA值。 舉個例子:

  Row Price  Qty   2.10  2.15  2.20  2.25  ....
    1  2.10  100      0     0     0     0
    2  2.15  200      0     0     0     0   
    3  2.25  100      0     0     0     0    
    4  2.10  100      0     0     0     0  
    5  2.25  300      0     0     0     0  

我正在嘗試使用dplyrmutate_each將函數傳遞給使用列標題名稱的所有列4:n 該函數將更改每一列,以便在其中Price = Column Name的行中應用Qty 在下面看到所需的結果:

  Row Price  Qty   2.10  2.15  2.20  2.25  ....
    1  2.10  100    100     0     0     0
    2  2.15  200      0   200     0     0   
    3  2.25  100      0     0     0   100    
    4  2.10  100    100     0     0     0  
    5  2.25  300      0     0     0   300  

關於如何執行此操作有任何想法嗎?


# input data
DF <- structure(list(Row = 1:5, Price = c(2.1, 2.15, 2.25, 2.1, 2.25
), Qty = c(100L, 200L, 100L, 100L, 300L), X2.10 = c(0L, 0L, 0L, 
0L, 0L), X2.15 = c(0L, 0L, 0L, 0L, 0L), X2.20 = c(0L, 0L, 0L, 
0L, 0L), X2.25 = c(0L, 0L, 0L, 0L, 0L)), .Names = c("Row", "Price", 
"Qty", "2.10", "2.15", "2.20", "2.25"), class = "data.frame", row.names = c(NA, 
-5L))   

您可以通過重塑來創建價格欄:

library(reshape2)
dcast(DF[1:3], Row+Price+Qty ~ Price, value.var = "Qty", fill = 0) 

#   Row Price Qty 2.1 2.15 2.25
# 1   1  2.10 100 100    0    0
# 2   2  2.15 200   0  200    0
# 3   3  2.25 100   0    0  100
# 4   4  2.10 100 100    0    0
# 5   5  2.25 300   0    0  300

使用上述方法,第二欄中未顯示的價格將不會獲得其自己的欄。 如果這種情況很重要,我將使用data.table:

library(data.table)
setDT(DF)
for (j in names(DF)[-(1:3)]){  
  ii = which( DF$Price == as.numeric(j) )
  set(DF, i=ii, j=j, v=DF$Qty[ii]) }

#   Row Price Qty 2.10 2.15 2.20 2.25
# 1   1  2.10 100  100    0    0    0
# 2   2  2.15 200    0  200    0    0
# 3   3  2.25 100    0    0    0  100
# 4   4  2.10 100  100    0    0    0
# 5   5  2.25 300    0    0    0  300

我確信mutate_each可以完成類似的操作。

另一種方法是進行聯接,如下所示:

require(data.table) # v1.9.6+
setDT(DF)
for (p in tail(names(DF), -3L))
    DF[.(Price=as.numeric(p)), (p) := Qty, on="Price"]
DF[]
#    Row Price Qty 2.10 2.15 2.20 2.25
# 1:   1  2.10 100  100    0    0    0
# 2:   2  2.15 200    0  200    0    0
# 3:   3  2.25 100    0    0    0  100
# 4:   4  2.10 100  100    0    0    0
# 5:   5  2.25 300    0    0    0  300

連接可以通過data.table的語法與聚合和更新(就像子集一樣)結合使用。 這個想法是使用i參數提取匹配的行,並使用Qty的對應值更新該列的行。

請注意,這里沒有副本。 原始data.table通過引用進行更新。

暫無
暫無

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

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