我有一个包含Price和Material列的数据框,以及一个包含N列的真/假矩阵(每列是特定类型的材料),T / F值表示'material'字符串是否出现在数据矩阵
数据
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
...等
如何根据材料创建价格子集? 所以我可以计算出具有“金属”材料的价格的均值,范围模式等。
我最初的解决方案是增加
newMat<- data$price * materialmatrix.
然后对newMat(mean,quantile等)执行列操作
但这似乎是一种野蛮的做事方式,因为我想结合这些子集(例如金属和棉花的平均价格)。
我也试过
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
和subset
,但我对R的理解不够强大,无法执行。
我知道这可能非常简单,但我仍然坚持如何使用矩阵创建多个子集,而不是一次创建一个子集。
任何帮助都会很棒。
我查看了以下内容
Subsetting a data.frame with an integer matrix
subsetting matrix with id from another matrix
Select observations from a subset to create a new subset based on a large dataframe in R
R Selecting column in a data frame by column in another data frame
答案 0 :(得分: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