2017-10-16 49 views
0

我试图在两个步骤中将两个简单函数应用于矩阵中的1:n列上的所有行或者df我希望将最后一列中的值用作函数中的输入。 这个问题可能是重复的,但我根本找不到我要找的解决方案。我尝试过写一个函数,apply和dplyr函数,但是在每一处如何引用特定的列,并为每个x,y的组合获得单独的结果都卡住了。应用使用数据框中的列作为1:n列和行上的每个值的输入的函数

我已经在这里看到的答案[how to apply a function to every row of a matrix (or a data frame) in R这里:

但这些操作大多是行或列明智的,我需要的函数,在每个观测工作,即

这是一个简化我的数据的例子 - 但我的数据框在变量和长度上的长度都不相同,因为我正在测量深度可变的深度剖面。

1日所需的功能:

df<- matrix(c( 
     1.11543500, 1.09273900, 1.09362300, 1.09073300, 1.09668300, 0.0876387143, 
     1.08729500, 1.06946100, 1.06227900, 1.06633600, 1.06690000, 0.0853604143, 
     1.05458300, 1.03921000, 1.03225300, 1.03782000, 1.03416200, 0.0790749429, 
     1., 1.01204520, 1.00525750, 1.00781250, 1.00666170, 0.0756004571 
    ), nrow = 4, byrow = TRUE) 

首先我必须宽幅使用df应用功能等;

对于V1的每一行:由V6 V5减,这将使像这样的输出(将罚款离开V6出来:

df1 
     V1   V2   V3   V4   V5   V6 
1 1.027796286 1.005100286 1.005984286 1.003094286 1.009044286 0.087638714 
2 1.001934586 0.984100586 0.976918586 0.980975586 0.981539586 0.085360414 
3 0.975508057 0.960135057 0.953178057 0.958745057 0.955087057 0.079074943 
4 0.952231643 0.936444743 0.929657043 0.932212043 0.931061243 0.075600457 

我曾尝试:

df1<- apply(df, 1, function(x) x[1:5]-x[6]) 

它给了我这个,这是错误的:

df1 [,1]  [,2]  [,3]  [,4] 
[1,] 1.027796 1.0019346 0.9755081 0.9522316 
[2,] 1.005100 0.9841006 0.9601351 0.9364447 
[3,] 1.005984 0.9769186 0.9531781 0.9296570 
[4,] 1.003094 0.9809756 0.9587451 0.9322120 
[5,] 1.009044 0.9815396 0.9550871 0.9310612 

任何人有关于如何纠正代码的建议?我也ope n用于例如dplyr中的建议或要调用的函数。

我希望它也会给我一个答案,关于如何继续下一步,我将不得不从第一次计算转置结果并添加一些其他具有临时和盐度值以及常量的列通过如下公式来计算:

x = z- [constant_t * (t1 - t2) + constant_s * S] 

其中z将是第一次计算的输出。

回答

0

您可以使用dplyr中的mutate_at来执行此操作。我已使用ncol来标识要使用的列。您可以使用t(),因为@PoGibas建议继续下一步。

library(dplyr) 
df <- as_tibble(df) 
df1 <- mutate_at(df, 1:(ncol(df) -1), funs(. - df[[ncol(df)]])) 
df1 
#> # A tibble: 4 x 6 
#>   V1  V2  V3  V4  V5   V6 
#>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> 
#> 1 1.0277963 1.0051003 1.0059843 1.0030943 1.0090443 0.08763871 
#> 2 1.0019346 0.9841006 0.9769186 0.9809756 0.9815396 0.08536041 
#> 3 0.9755081 0.9601351 0.9531781 0.9587451 0.9550871 0.07907494 
#> 4 0.9522316 0.9364447 0.9296570 0.9322120 0.9310612 0.07560046 

t(df1) 
#>   [,1]  [,2]  [,3]  [,4] 
#> V1 1.02779629 1.00193459 0.97550806 0.95223164 
#> V2 1.00510029 0.98410059 0.96013506 0.93644474 
#> V3 1.00598429 0.97691859 0.95317806 0.92965704 
#> V4 1.00309429 0.98097559 0.95874506 0.93221204 
#> V5 1.00904429 0.98153959 0.95508706 0.93106124 
#> V6 0.08763871 0.08536041 0.07907494 0.07560046 

如果你喜欢最后一个变量从结果投下您可以使用transmute_at代替mutate_at

transmute_at(df, 1:(ncol(df) -1), funs(. - df[[ncol(df)]])) 

#> # A tibble: 4 x 5 
#>   V1  V2  V3  V4  V5 
#>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> 
#> 1 1.0277963 1.0051003 1.0059843 1.0030943 1.0090443 
#> 2 1.0019346 0.9841006 0.9769186 0.9809756 0.9815396 
#> 3 0.9755081 0.9601351 0.9531781 0.9587451 0.9550871 
#> 4 0.9522316 0.9364447 0.9296570 0.9322120 0.9310612 
+0

谢谢@markdly!它工作正常!我一直忘记“。”快乐!但只有这样才不会像你的整个代码那样有帮助。但是,当我问@PoGibas时 - 脚本中是否会有一种方法来引用col名称?下一步涉及5列,这将更容易,更安全!通过名称来调用它们,因为我的df有178个变量。 –

+0

和tibble对我来说是新的!太好了!/谢谢 –

+0

@ E.ThereseHarvey,很高兴帮助!要在上面的例子中使用列名,你可以使用mutate_at(df,vars(V1:V5),funs(。-V6))''。您可能还想看看'?dplyr :: select_helpers'的其他方法,您可以根据它们的名称来选择变量,而不是'vars()'内部的'V1:V5'。 – markdly

相关问题