[英]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
我正在嘗試使用dplyr
和mutate_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.