r - 根据类似名称的列中的值将值赋予新列

标签 r dplyr data.table pivot-table tidyverse

我有一个数据框,它具有从一个单位的质心到不同点的距离。这些点由数字和我试图获得的新列标识,在该列中我获得到最近物体的距离。

所以数据框看起来像这样:

FID <- c(12, 12, 14, 15, 17, 18)
year <- c(1990, 1994, 1983, 1953, 1957, 2000)
centroid_distance_1 <- c(220.3, 220.3, 515.6, NA, 200.2, 22)
centroid_distance_2 <- c(520, 520, 24.3, NA , NA, 51.8)
centroid_distance_3 <- c(NA, 12.8, 124.2, NA, NA, 18.8)
centroid_distance_4 <- c(725.3, 725.3, 44.2, NA, 62.9, 217.9)
sample2 <- data.frame(FID, year, centroid_distance_1, centroid_distance_2, centroid_distance_3, centroid_distance_4)


    sample2
  FID year centroid_distance_1 centroid_distance_2 centroid_distance_3 centroid_distance_4
1  12 1990               220.3               520.0                  NA               725.3
2  12 1994               220.3               520.0                12.8               725.3
3  14 1983               515.6                24.3               124.2                44.2
4  15 1953                  NA                  NA                  NA                  NA
5  17 1957               200.2                  NA                  NA                62.9
6  18 2000                22.0                51.8                18.8               217.9

FID是每个单位的标识符,year是年份指标。每行都是一个 FID*year 对。 centroid_distance_x 是该行的质心与对象 x 之间的距离。这是数据框的一个小样本,其中包含更多的列和行。

我正在寻找的是这样的:

short_distance <- c(220.3, 12.8, 24.3, NA, 62.9,18.8)
unit <- c(1, 3, 2, NA, 4, 3)
ideal.df <- data.frame(FID, year, short_distance, unit)

ideal.df
  FID year short_distance unit
1  12 1990          220.3    1
2  12 1994           12.8    3
3  14 1983           24.3    2
4  15 1953             NA   NA
5  17 1957           62.9    4
6  18 2000           18.8    3

基本上,我添加了一个名为 short_distance 的列,该列是上面所有 centroid_distance_* 列中具有较低值的单元格,还有一个名为 unit 标识每一行距离较小的对象(因此,如果一行在 centorid_distance_1 中具有最小值,则它采用 1 的值单位).

我已经用 dplyr 尝试了很多东西,并旋转和重新旋转数据框,但我真的没有到达那里。

非常感谢您的帮助!

最佳答案

另一个基于 tidyverse 的解决方案 - 使用 pivot_longer - 可能如下所示。

library(dplyr)
library(tidyr)
library(stringr)

sample2 %>%
  pivot_longer(-c(FID, year)) %>%
  group_by(year, FID) %>%
  slice_min(value, n = 1, with_ties = FALSE) %>%
  mutate(unit = str_sub(name, -1)) %>%
  select(-name, short_distance = value)

# Groups:   year, FID [6]
#     FID  year short_distance unit 
#   <dbl> <dbl>          <dbl> <chr>
# 1    15  1953           NA   1    
# 2    17  1957           62.9 4    
# 3    14  1983           24.3 2    
# 4    12  1990          220.  1    
# 5    12  1994           12.8 3    
# 6    18  2000           18.8 3   

关于r - 根据类似名称的列中的值将值赋予新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65779588/

相关文章:

r - require() 和library() 有什么区别?

r - 使用 ggplot2 在给定的 x 值处绘制数据帧的每行一行

减少 ggplot 箱线图中离散轴末端的空间

带有 dplyr 和 magrittr 的 rollmean

r - 可以有条件地计算 dplyr::summarize() 的不同部分吗?

r - 使用 group by 对 data.table 列进行子集化

r - 数据表错误 "maxn (N) is not exact multiple of this j column' s长度(J)"

git - 从 RStudio 推送到 Github

r - geosphere distHaversine() & dplyr - 向量的错误长度错误,应该是 2

r - 粘贴两个 data.table 列