首页 > 解决方案 > 在 r 的列中选择最后一个值

问题描述

我有这个条件:

Animal  Date.1  Weight.1    Date.2  Weight.2    Date.3  Weight.3    Date.4  Weight.4
1       12/18/19    55      1/2/20  67                              6/6/20  101
2       12/18/19    64      1/3/20  69          2/4/20  80      
3       12/18/19    75                      
4                           1/3/20  85              
5       12/18/19    88      1/6/20  86          2/7/20  96          6/6/20  100

我想选择 weight.1 之后的最后一个重量,如下所示:

Animal  Date.last   Last Weight
1       6/6/20      101
2       2/4/20      80
3       NA          NA
4       1/3/20      85
5       6/6/20      100

抱歉,我没有显示任何脚本,但我什至不知道从哪里开始。

标签: rdataframe

解决方案


这是重塑为“长”格式后的一个选项

library(dplyr)    
library(tidyr)
library(stringr)
df1 %>% 
   pivot_longer(cols = -Animal, names_to = c(".value", "group"), 
        names_sep="[.]", values_drop_na = TRUE) %>%
   group_by(Animal) %>% 
   slice(n()) %>% 
   ungroup %>%
   mutate_at(vars(Date, Weight), ~ replace(., group == 1, NA)) %>%
   select(-group) %>%
   rename_at(2:3, ~ str_c(., 'last')) 
# A tibble: 5 x 3
#  Animal Datelast Weightlast
#   <int> <chr>         <int>
#1      1 6/6/20          101
#2      2 2/4/20           80
#3      3 <NA>             NA
#4      4 1/3/20           85
#5      5 6/6/20          100

数据

df1 <- structure(list(Animal = 1:5, Date.1 = c("12/18/19", "12/18/19", 
"12/18/19", NA, "12/18/19"), Weight.1 = c(55L, 64L, 75L, NA, 
88L), Date.2 = c("1/2/20", "1/3/20", NA, "1/3/20", "1/6/20"), 
    Weight.2 = c(67L, 69L, NA, 85L, 86L), Date.3 = c(NA, "2/4/20", 
    NA, NA, "2/7/20"), Weight.3 = c(NA, 80L, NA, NA, 96L),
    Date.4 = c("6/6/20", 
    NA, NA, NA, "6/6/20"), Weight.4 = c(101L, NA, NA, NA, 100L
    )), class = "data.frame", row.names = c(NA, -5L))

推荐阅读