我试图想出一种方法来创建一个基于两列组合的新矩阵。
df <- data.frame(a=100:120, b=90:110, c=95:115, d=letters[1:21])
例如, 我想要一个和d,b和d,c和d的组合。 如果a中的值小于110且d中的值在a到d中,我想创建一个新列a1并将该值赋值为0.003。如果d在e到f中,我想分配0.005等。如果想对每个组合做同样的事情。因此,得到的矩阵将是20 x 3.我尝试了像这样的mapply
func <- function(a, d){
if(a >= 110 & d %in% c("a","b","c","d")
{
y <- 0.003
}
else if(a >= 110 & d %in% c("e","f")){
y <- 0.005
}
else{
y <- 1
}
}
g <- mapply(func , df, df$d)
它返回一个包含20个元素的向量。我期待20 x 3矩阵。我应该使用哪种应用功能?感谢。
答案 0 :(得分:1)
试试这段代码。我的理解是你想要(k-1)组合,其中k是列数,与最后一个元素的数据框中的每一列,运行你在上面针对某个组合的列定义的函数,并将结果存储在一列中。结果应为n乘(k-1):
df <- data.frame(a=100:120, b=90:110, c=95:115, d=letters[1:21])
func <- function(a, d){
if(a >= 110 & d %in% c("a","b","c","d"))
{
y <- 0.003
}
else if(a >= 110 & d %in% c("e","f")){
y <- 0.005
}
else{
y <- 1
}
}
result.df = data.frame();
for(i in 1:(length(df) - 1)) { #assuming that d is the last element always
g <- mapply(func , df[[i]], df[[length(df)]]);
if(length(result.df) == 0) {
result.df = as.data.frame(g)
} else {
result.df = cbind(result.df, as.data.frame(g))
}
colnames(result.df)[i] = i;
}
result.matrix = as.matrix(result.df) #if you want the result as a matrix