将data.frame转换为高维矩阵

时间:2019-04-22 08:48:21

标签: r dataframe matrix multidimensional-array vector

例如,考虑以下数据

           public function showResetForm(Request $request, $token = null)
{
    return view('auth.passwords.reset')->with(
        ['token' => $token, 'email' => $request->email]
    );
}


            public function reset(Request $request)
{
    $this->validate($request, $this->rules(), $this->validationErrorMessages());

    // Here we will attempt to reset the user's password. If it is successful we
    // will update the password on an actual user model and persist it to the
    // database. Otherwise we will parse the error and return the response.
    $response = $this->broker()->reset(
        $this->credentials($request), function ($user, $password) {
            $this->resetPassword($user, $password);
        }
    );

    // If the password was successfully reset, we will redirect the user back to
    // the application's home authenticated view. If there is an error we can
    // redirect them back to where they came from with their error message.
    return $response == Password::PASSWORD_RESET
                ? $this->sendResetResponse($response)
                : $this->sendResetFailedResponse($request, $response);
}

我想知道如何写> sample.df f1 f2 x1 x2 x3 1 2 2 7.28 9.40 5.02 2 1 1 6.30 9.56 3.74 3 2 1 6.88 8.72 3.14 4 1 2 6.68 9.58 3.84 这样

MAGIC

基本上,> sample.matrix <- MAGIC(sample.df) > sample.matrix[1, 1, ] [1] 6.30 9.56 3.74 > sample.matrix[1, 2, ] [1] 6.68 9.58 3.84 使用sample.matrix[x, y, ]选择数据帧中的行,然后删除指示sample.df[sample.df$f1 == x & sample.df$f2 == y, ]f1的值的冗余列。请注意,f2的每种组合在数据框中只会出现一次。

我的第一个想法是(f1, f2),然后是as.matrix,但是数据框中的行未排序。对其进行排序将需要O(n * log(n)),但是我只想创建一个表,因此从理论上讲,时间复杂度可以受O(n)约束。

如果可以的话,最好利用向量化。

2 个答案:

答案 0 :(得分:3)

这是一个通过matrix的想法。请注意,这与所需的输出并不完全相同,但是可以轻松对其进行转换。

假设df是您的sample.df

m1 <- matrix(do.call(paste, df[with(df, order(f1, f2)),-c(1, 2)]), nrow = 2, byrow = TRUE)
m1[1, 2]
#[1] "6.68 9.58 3.84"
m1[1, 1]
#[1] "6.3 9.56 3.74"
m1[2, 1]
#[1] "6.88 8.72 3.14"
m1[2, 2]
#[1] "7.28 9.4 5.02"

您可以通过拆分(即

)将其作为数字矢量获得。
as.numeric(strsplit(m1[1, 2], ' ')[[1]])
#[1] 6.68 9.58 3.84

答案 1 :(得分:1)

编辑

再次阅读问题后,我认为我们可以使用split而不使用order来避免排序步骤。由于f1f2对于每一行都是唯一的,因此我们可以做到

split(sample.df[, -(1:2)], list(sample.df$f1, sample.df$f2))


#$`1.1`
#   x1   x2   x3
#2 6.3 9.56 3.74

#$`2.1`
#    x1   x2   x3
#3 6.88 8.72 3.14

#$`1.2`
#    x1   x2   x3
#4 6.68 9.58 3.84

#$`2.2`
#    x1  x2   x3
#1 7.28 9.4 5.02

原始答案

我不清楚目标是什么,但一种方法是先ordersample.df f1 f2,然后再使用Map

new_df <- sample.df[with(sample.df, order(f1, f2)),]

Map(function(x, y) new_df[with(new_df, f1 == x & f2 == y), -(1:2)],
                   new_df$f1, new_df$f2)

#[[1]]
#   x1   x2   x3
#2 6.3 9.56 3.74

#[[2]]
#    x1   x2   x3
#4 6.68 9.58 3.84

#[[3]]
#    x1   x2   x3
#3 6.88 8.72 3.14

#[[4]]
#    x1  x2   x3
#1 7.28 9.4 5.02

如果以上是您的预期输出,那么new_df中的每一行都是您想要的输出。如果您希望将它们作为单独的列表,我们还可以split每行

split(new_df[, -(1:2)], seq_len(nrow(new_df)))

这将为您提供相同的输出。