我有一个数据框(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
Run Code Online (Sandbox Code Playgroud)
我试图使用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
Run Code Online (Sandbox Code Playgroud)
有关如何执行此操作的任何想法?
# 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))
Run Code Online (Sandbox Code Playgroud)
您可以通过重塑来创建价格cols:
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
Run Code Online (Sandbox Code Playgroud)
第二列中未显示的价格将不会使用上述方法获得自己的列.如果边缘情况很重要,我会使用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
Run Code Online (Sandbox Code Playgroud)
我确信可以做类似的事情mutate_each.