在dataframe的所有行和特定列上计算公式

在dataframe的所有行和特定列上计算公式,r,dataframe,row,apply,col,R,Dataframe,Row,Apply,Col,我有以下示例数据框,其中包含不同商店的玩具价格: dfData <- data.frame(article = c("Fix", "Foxi", "Stan", "Olli", "Barbie", "Ken", "Hulk"), priceToys1 = c(10, NA, 10.5, NA, 10.7, 11.2, 12.0), priceAllToys = c(NA, 11.4, NA, 11.9, 1

我有以下示例数据框,其中包含不同商店的玩具价格:

dfData <- data.frame(article = c("Fix", "Foxi", "Stan", "Olli", "Barbie", "Ken", "Hulk"),
                     priceToys1 = c(10, NA, 10.5, NA, 10.7, 11.2, 12.0),
                     priceAllToys = c(NA, 11.4, NA, 11.9, 11.7, 11.1, NA),
                     price123Toys = c(12, 12.4, 12.7, NA, NA, 11.0, 12.1))
如何在数据框中添加列,告诉我所有价格相对于最低价格的百分比因子?新列名还应包括店铺名称

结果应该如下所示:

#  article priceToys1 PercToys1 priceAllToys PercAllToys price123Toys Perc123Toys MinPrice
#1     Fix       10.0     100.0           NA          NA         12.0       120.0     10.0
#2    Foxi         NA        NA         11.4       100.0         12.4       108.8     11.4
#3    Stan       10.5     100.0           NA          NA         12.7       121.0     10.5
#4    Olli         NA        NA         11.9       100.0           NA          NA     11.9
#5  Barbie       10.7     100.0         11.7       109.4           NA          NA     10.7
#6     Ken       11.2     101.8         11.1       100.9         11.0       100.0     11.0
#7    Hulk       12.0     100.0           NA          NA         12.1       100.8     12.0

两种可能的解决办法:

1)和
数据。表
-包:

# load the 'data.table'-package
library(data.table)

# get the columnnames on which to operate
cols <- names(dfData)[2:4] # or: grep("price", names(dfData), value = TRUE)

# convert dfData to a 'data.table'
setDT(dfData)

# compute the 'fraction'-columns
dfData[, paste0('Perc', gsub('price','',cols)) := lapply(.SD, function(x) round(100 * x / MinPrice, 1))
       , .SDcols = cols][]
cols <- names(dfData)[2:4] # or: grep("price", names(dfData), value = TRUE)

dfData[, paste0('Perc', gsub('price','',cols))] <- round(100 * dfData[, cols] / dfData$MinPrice, 1)
2)带基数R:

# load the 'data.table'-package
library(data.table)

# get the columnnames on which to operate
cols <- names(dfData)[2:4] # or: grep("price", names(dfData), value = TRUE)

# convert dfData to a 'data.table'
setDT(dfData)

# compute the 'fraction'-columns
dfData[, paste0('Perc', gsub('price','',cols)) := lapply(.SD, function(x) round(100 * x / MinPrice, 1))
       , .SDcols = cols][]
cols <- names(dfData)[2:4] # or: grep("price", names(dfData), value = TRUE)

dfData[, paste0('Perc', gsub('price','',cols))] <- round(100 * dfData[, cols] / dfData$MinPrice, 1)

cols我们可以使用
mutate\u at
from
dplyr

library(dplyr)
library(magrittr)
dfData %<>% 
      mutate_at(vars(matches("^price")),  funs(Perc = round(100* ./MinPrice, 1)))
dfData
库(dplyr)
图书馆(magrittr)
dfData%%
在(变量(匹配(“^price”)、funs(Perc=round(100*/MinPrice,1))处进行变异
dfData

我不明白你在用apply做什么。你只需要做一次操作。Elin,我只想得到数据帧每一行的最低价格。只需要一个操作。我唯一的建议是,我认为他想保存它,所以分配结果。@Elin谢谢,我将其更改为分配复合运算符谢谢Jaap,我采用了基本R解决方案,效果很好;-)
library(dplyr)
library(magrittr)
dfData %<>% 
      mutate_at(vars(matches("^price")),  funs(Perc = round(100* ./MinPrice, 1)))
dfData