假设我有一个dataframe,它有多个组件及其属性列在多个列中,并且我想对这些列运行多个函数。我的方法是尝试以每个列标题中的子字符串为基础,但我还不能想出如何做到这一点。下面是数据框的示例。
Basket F_Type_1 F_Qty_1 F_P_1 F_Type_2 F_Qty_2 F_P_2
AAA Apple 10 2.5 Banana 9 2
BBB Peach 5 6 Melon 20 5实际上,我希望将两个新列绑定到这个乘以Qty和P的数据帧的末尾,这样您就可以在末尾得到两个新列,如下所示。
F_Total_1 F_Total_2
25 18
30 100输入是动态的,所以有时可能是2个水果或10个水果放在特定的篮子里。但我可以弄清楚这部分,它更多的是试图弄清楚如何根据子字符串'1‘或'2’来乘以列。
我非常感谢您的帮助和您可能拥有的任何其他方法!
发布于 2018-06-19 03:11:17
我们创建一个查找特定名称的函数,然后计算行式乘积。此函数的重量级函数是mapply函数。我们添加最后一步来重命名结果data.frame。
fun1 <- function(data){
qty_names <- names(data)[grepl(pattern = "Qty", x = names(data))]
p_names <- names(data)[grepl(pattern = "P", x = names(data))]
setNames(
data.frame(
mapply(qty_names, p_names,
FUN = function(n1, n2) apply(data[c(n1,n2)], 1, prod))),
paste0('F_Total_', 1:length(p_names)))
}
cbind(dat, fun1(dat))
Basket F_Type_1 F_Qty_1 F_P_1 F_Type_2 F_Qty_2 F_P_2 F_Total_1 F_Total_2
1 AAA Apple 10 2.5 Banana 9 2 25 18
2 BBB Peach 5 6.0 Melon 20 5 30 100发布于 2018-06-19 03:08:42
创建数据
library(data.table)
df <- fread("
Basket F_Type_1 F_Qty_1 F_P_1 F_Type_2 F_Qty_2 F_P_2
AAA Apple 10 2.5 Banana 9 2
BBB Peach 5 6 Melon 20 5
")
df
# Basket F_Type_1 F_Qty_1 F_P_1 F_Type_2 F_Qty_2 F_P_2
# 1: AAA Apple 10 2.5 Banana 9 2
# 2: BBB Peach 5 6.0 Melon 20 5对于从1到sum(grepl('F_P_', names(df)))的数字,将F_Total_{number}设置为F_Qty_{number}*F_P_{number}
for(i in seq(sum(grepl('F_P_', names(df)))))
df[, paste0('F_Total_', i) := Reduce(`*`, .SD)
, .SDcols = paste0(c('F_Qty_', 'F_P_'), i)]
df
# Basket F_Type_1 F_Qty_1 F_P_1 F_Type_2 F_Qty_2 F_P_2 F_Total_1 F_Total_2
# 1: AAA Apple 10 2.5 Banana 9 2 25 18
# 2: BBB Peach 5 6.0 Melon 20 5 30 100或使用df作为data.frame的base R中
for(i in seq(sum(grepl('F_P_', names(df)))))
df[paste0('F_Total_', i)] <- Reduce(`*`, df[paste0(c('F_Qty_', 'F_P_'), i)])发布于 2018-06-19 03:10:42
在base R中,您可以使用[[]]表单访问带有字符串的列,因此可以轻松地进行循环
df <- read.table(text = "Basket F_Type_1 F_Qty_1 F_P_1 F_Type_2 F_Qty_2 F_P_2
AAA Apple 10 2.5 Banana 9 2
BBB Peach 5 6 Melon 20 5",header = T)
for(i in 1:2)
{
df[[paste0("F_Total_",i)]] <- as.numeric(df[[paste0("F_P_",i)]])*as.numeric(df[[paste0("F_Qty_",i)]])
}
Basket F_Type_1 F_Qty_1 F_P_1 F_Type_2 F_Qty_2 F_P_2 F_Total_1 F_Total_2
1 AAA Apple 10 2.5 Banana 9 2 25 18
2 BBB Peach 5 6.0 Melon 20 5 30 100https://stackoverflow.com/questions/50915853
复制相似问题