例如,考虑以下数据
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)约束。
如果可以的话,最好利用向量化。
答案 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
来避免排序步骤。由于f1
和f2
对于每一行都是唯一的,因此我们可以做到
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
原始答案
我不清楚目标是什么,但一种方法是先order
,sample.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)))
这将为您提供相同的输出。