结合列的应用结果

时间:2016-03-04 13:45:33

标签: r

说,我有一个数据框。在我的应用程序中,此数据框的维度和列名称是先验未知的,但例如:

  v1 <- sample(1:100, 5, replace=F)
  v2 <- sample(1:100, 5, replace=F)
  v3 <- sample(1:100, 5, replace=F)

  sample_matrix <- data.frame(v1, v2, v3)

我想为sample_df的每一行应用一个函数。事实上,函数也是未知的,除了它返回一个向量。作为应用操作的结果,我需要具有相同行数的数据帧。

如果函数返回的长度大于1,则apply的结果将组合为列,而不是行:

  dummy_func1 <- function(x) c(1, 2)
  apply(sample_matrix, 1, dummy_func1)

    X1 X2 X3 X4 X5
  1  1  1  1  1  1
  2  2  2  2  2  2

如果事先知道,该函数返回的参数多于1,则可以使用转置处理:

  data.frame(t(apply(sample_matrix, 1, dummy_func1)))

    X1 X2
  1  1  2
  2  1  2
  3  1  2
  4  1  2
  5  1  2

但是,如果函数正好返回1个参数,则它与所需的相反:

  dummy_func2 <- function(x) c(1)
  data.frame(t(apply(sample_matrix, 1, dummy_func2))

    X1 X2 X3 X4 X5
  1  1  1  1  1  1

目前,我在我的项目中做的是有条件地转置,这有点难看:

  res <- data.frame(apply(sample_matrix, 1, dummy_func2))
  if(ncol(res) > 1) res <- t(res)

我发现的答案大多建议使用plyr,但我认为我不能使用plyr(或者我可以吗?),因为在我的项目中,数据框和函数都不是事先知道的。

我的问题是,不管返回长度如何,更好的方法是将结果总是组合成列,而不是使用vanilla apply。

1 个答案:

答案 0 :(得分:1)

您可以使用echo “`grep "SS" file | sed -re '/([0-9]{1,3}\.){4}/p' | grep -v drama`” | rev | sed -i …|rev ,这样您就可以获得结果列表:

sed -ri 'drama/! { /SS/ s/SS/S/;s/#// } '  file