如何根据R

时间:2017-05-16 03:19:38

标签: r

我试图想出一种方法来创建一个基于两列组合的新矩阵。

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矩阵。我应该使用哪种应用功能?感谢。

1 个答案:

答案 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
相关问题