我有一个由近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观察迭代需要太多时间。
我的想法:我在想是否有办法过滤掉每次观察使用哪个(),这样我就能找到最小值。然后呢?
感谢高级, 这是杀了我,它花了我整个上午,仍然没有解决方案。
答案 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 操作)。