1

我有一个包含价格和材料列的数据框,以及一个包含 N 列的真/假矩阵(每列是一种特定类型的材料),并且 T/F 值表示“材料”字符串是否出现在数据矩阵中

数据

Price    Material
2.33     Metal nickel linen cotton
3.45     silver emerald steel
7.45     cotton silk wood

矩阵

Metal Nickel Linen Cotton Silver Emerald Steel Cotton Silk Wood
T     T      T     T      0      0       0     0      0    0
0     0      0     0      T      T       T     0      0    0  

...ETC。

如何根据材料创建价格子集?所以我可以计算具有“金属”材料的价格的平均值、范围模式等。

我最初的解决方案是将

newMat<- data$price * materialmatrix. 

然后在 newMat 上执行列操作(平均值、分位数等)

但这似乎是一种残酷的做事方式,因为我想结合子集(例如金属和棉花的平均价格)。

我也试过

split(data, wsearch, drop=TRUE)

但得到了警告。

Warning message:
  In split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...)  
  data length is not a multiple of split variable

试图使用lapply, split, ddply, and subset,但我对 R 的理解还不够强,无法执行。

我知道这可能很简单,但我一直坚持如何使用矩阵来创建多个子集,而不是一次创建一个子集。

任何帮助都会很棒。

我看过以下

使用整数矩阵对 data.frame 进行子集

用另一个矩阵的 id 对矩阵进行子集化

从子集中选择观察值以基于 R 中的大型数据框创建新子集

R在另一个数据框中逐列选择数据框中的列

4

1 回答 1

1

这是你想要的吗?

library(reshape2)
library(splitstackshape)

# sample data
df <- data.frame(price = c(17, 35, 12, 26, 1.35, 10),
                 material = c("linen",
                              "wax string metal cube",
                              "Metal nickel linen cotton",
                              "brass",
                              "linen",
                              "cotton silk wood"))

# split the concatenated material variable
df2 <- concat.split(data = df, split.col = "material", sep = " ", drop = TRUE)

# replace blanks with NA
df2[df2 == ""] <- NA

# melt data to long format
df3 <- melt(df2, id.vars = "price", na.rm = TRUE)

# calculate summary stats by material (= 'value' variable)
df4 <- aggregate(price ~ value, data = df3, summary)

#     value price.Min. price.1st Qu. price.Median price.Mean price.3rd Qu. price.Max.
# 1   brass     26.000        26.000       26.000     26.000        26.000     26.000
# 2  cotton     10.000        10.500       11.000     11.000        11.500     12.000
# 3    cube     35.000        35.000       35.000     35.000        35.000     35.000
# 4   linen      1.350         6.675       12.000     10.120        14.500     17.000
# 5   metal     35.000        35.000       35.000     35.000        35.000     35.000
# 6   Metal     12.000        12.000       12.000     12.000        12.000     12.000
# 7  nickel     12.000        12.000       12.000     12.000        12.000     12.000
# 8    silk     10.000        10.000       10.000     10.000        10.000     10.000
# 9  string     35.000        35.000       35.000     35.000        35.000     35.000
# 10    wax     35.000        35.000       35.000     35.000        35.000     35.000
# 11   wood     10.000        10.000       10.000     10.000        10.000     10.000
于 2013-10-25T19:53:34.133 回答