说,我有一个数据框。在我的应用程序中,此数据框的维度和列名称是先验未知的,但例如:
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。
答案 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