对于每次观察

时间:2018-06-01 13:00:49

标签: r

我有一个由近200,000个观察组成的DataFrame。 重要列类似于:(注意:默认情况下不填充最小值)

Key        Value      Min Value
1xA         1           1
2xA         2           2
3xB         3           2 
1xB         1           1
1xA         5           1 
2xB         2           2
3xB         2           2
2xA         4           2

如何实现这一点来填充R中的Min Value列? 我尝试在数据框中循环,并在检查特定观察时找到为密钥创建的最小子集,并且它工作正常。 但是执行200,000观察迭代需要太多时间。

我的想法:我在想是否有办法过滤掉每次观察使用哪个(),这样我就能找到最小值。然后呢?

感谢高级, 这是杀了我,它花了我整个上午,仍然没有解决方案。

2 个答案:

答案 0 :(得分:0)

使用dplyr,这并不复杂:

df
#    Key Value
# 1 1xA     1
# 2 2xA     2
# 3 3xB     3
# 4 1xB     1
# 5 1xA     5
# 6 2xB     2
# 7 3xB     2
# 8 2xA     4

df %>% 
    dplyr::group_by(Key) %>% 
    dplyr::mutate(Min.Value = min(Value))
# A tibble: 8 x 3
# Groups:   Key [5]
#   Key   Value Min.Value
#   <fct> <int>     <dbl>
# 1 1xA       1         1
# 2 2xA       2         2
# 3 3xB       3         2
# 4 1xB       1         1
# 5 1xA       5         1
# 6 2xB       2         2
# 7 3xB       2         2
# 8 2xA       4         2

答案 1 :(得分:0)

仅限基本功能:

merge(df, aggregate(list(Min.Value=df$Value), by=list(key=df$Key), FUN=min), by="Key")

aggregate函数采用Value列(第一个参数),按照by参数提供的值对其进行分组(必须是与长度相同的向量列表)第一个参数),并将FUN函数应用于每个组(此处为min)。第一个参数被包装到列表中,只是为了重命名结果列(如果只用df$Value替换它,结果列将被命名为x。)

外部merge连接所提供的两个数据框的行,这些数据框在Key列中具有相同的值(即很像数据库 join 操作)。