簡體   English   中英

如何基於不同列中的值對列進行子集?

[英]How to subset columns based on value in a different column?

編輯:

我有一個數據框,用於存儲有關何時進行特定評估(何時)的信息。 此評估發生在不同的時間(t1-t3),具體時間因參與者而異。

數據框還包含每個參與者曾經完成的所有評估(包括“時間”列中引用的評估)。 我只想要“時間”列中表示的評估信息。 因此,如果數字為1,我想保留與該評估有關的所有數據,並刪除該評估未收集的所有數據。 請注意,實際數據集中的變量比此縮短的數據集中的變量多,因此任何解決方案都不應依賴重復的變量名。

這是我能做的最好的。 該解決方案的問題在於,必須為每個變量名稱重復該解決方案。

df2 <- mutate(.data = df, 
                        a1G_when = if_else(when == 1, a1G_t1, NA_real_))

# here is what we start with
df <- structure(list(id = 1:10, when = c(1, 3, 2, 1, 2, 1, 3, 2, 3, 
1), a1G_t1 = c(0.78, 0.21, 0.04, 0.87, 0.08, 0.25, 0.9, 0.77, 
0.51, 0.5), Stqo_t1 = c(0.68, 0.77, 0.09, 0.66, 0.94, 0.05, 0.97, 
0.92, 1, 0.04), Twcdz_t1 = c(0.95, 0.41, 0.29, 0.54, 0.06, 0.45, 
0.6, 0.24, 0.17, 0.55), Kgh_t1 = c(0.25, 0.86, 0.37, 0.34, 0.97, 
0.75, 0.73, 0.68, 0.37, 0.66), `2xWX_t1` = c(0.47, 0.52, 0.23, 
0.5, 0.88, 0.71, 0.21, 0.98, 0.76, 0.21), `2IYnS_t1` = c(0.32, 
0.75, 0.03, 0.46, 0.89, 0.71, 0.51, 0.83, 0.34, 0.32), a1G_t2 = c(0.97, 
0.01, 0.58, 0.33, 0.58, 0.37, 0.76, 0.33, 0.39, 0.56), Stqo_t2 = c(0.78, 
0.42, 0.5, 0.69, 0.09, 0.72, 0.84, 0.94, 0.46, 0.83), Twcdz_t2 = c(0.62, 
0.34, 0.72, 0.62, 0.8, 0.26, 0.3, 0.88, 0.42, 0.53), Kgh_t2 = c(0.99, 
0.66, 0.02, 0.17, 0.51, 0.03, 0.03, 0.74, 0.1, 0.26), `2xWX_t2` = c(0.68, 
0.97, 0.56, 0.27, 0.66, 0.71, 0.96, 0.24, 0.37, 0.76), `2IYnS_t2` = c(0.24, 
0.88, 0.58, 0.31, 0.8, 0.92, 0.91, 0.9, 0.55, 0.52), a1G_t3 = c(0.73, 
0.6, 0.66, 0.06, 0.33, 0.34, 0.09, 0.44, 0.73, 0.56), Stqo_t3 = c(0.28, 
0.88, 0.56, 0.75, 0.85, 0.33, 0.88, 0.4, 0.63, 0.61), Twcdz_t3 = c(0.79, 
0.95, 0.41, 0.07, 0.99, 0.06, 0.74, 0.17, 0.89, 0.4), Kgh_t3 = c(0.06, 
0.52, 0.35, 0.91, 0.43, 0.74, 0.72, 0.96, 0.39, 0.4), `2xWX_t3` = c(0.25, 
0.09, 0.64, 0.32, 0.15, 0.14, 0.18, 0.33, 0.97, 0.6), `2IYnS_t3` = c(0.92, 
0.49, 0.09, 0.95, 0.3, 0.83, 0.82, 0.56, 0.29, 0.36)), row.names = c(NA, 
-10L), class = "data.frame")

# here is an example of what I want with the first column. I would also want all other repeating columns to look like this (Stq0_when, Twcdz, etc.)

 id when a1G_when
1   1    1   0.78
2   2    3   0.88
3   3    2   0.58
4   4    1   0.87
5   5    2   0.58
6   6    1   0.25
7   7    3   0.09
8   8    2   0.33
9   9    3   0.73
10 10    1   0.50



這是使用新的tidyr::pivot_longer的機會。 我們可以使用它來調整數據的形狀,使vart在它們自己的列中,僅filter出具有所需數據的行(即t等於when ),然后將數據旋轉回寬。

library(tidyverse)
df1 <- structure(list(ID = c(101, 102, 103, 104, 105), when = c(1, 2, 3, 1, 2), var1_t1 = c(5, 6, 4, 5, 6), var2_t1 = c(2, 3, 4, 2, 3), var1_t2 = c(7, 8, 9, 7, 8), var2_t2 = c(5, 4, 5, 4, 5), var1_t3 = c(3, 4, 3, 4, 3), var2_t3 = c(6, 7, 6, 7, 6)), row.names = c(NA, 5L), class = "data.frame")

df1 %>%
  pivot_longer(
    cols = starts_with("var"),
    names_to = c("var", "t"),
    names_sep = "_t",
    values_to = "val",
    col_ptypes = list(var = character(), t = numeric())
  ) %>%
  filter(when == t) %>%
  select(-t) %>%
  pivot_wider(names_from = "var", values_from = "val")
#> # A tibble: 5 x 4
#>      ID  when  var1  var2
#>   <dbl> <dbl> <dbl> <dbl>
#> 1   101     1     5     2
#> 2   102     2     8     4
#> 3   103     3     3     6
#> 4   104     1     5     2
#> 5   105     2     8     5

reprex軟件包 (v0.3.0)創建於2019-07-16

使用data.table ,您可以執行以下操作:

library(data.table)

cols <- unique(paste0(gsub("_.*", "", setdiff(names(df), c("id", "when"))), "_when"))

setDT(df)[
  , (cols) := lapply(cols, function(x) paste0(gsub("_.*", "", x), "_t", when))][
    , (cols) := lapply(cols, function(x) as.character(.SD[[get(x)]])), by = cols][
      , (cols) := lapply(.SD, as.numeric), .SDcols = cols
    ]

輸出(僅前10行,僅whenwhen相關):

    a1G_when Stqo_when Twcdz_when Kgh_when 2xWX_when 2IYnS_when
 1:     0.78      0.68       0.95     0.25      0.47       0.32
 2:     0.60      0.88       0.95     0.52      0.09       0.49
 3:     0.58      0.50       0.72     0.02      0.56       0.58
 4:     0.87      0.66       0.54     0.34      0.50       0.46
 5:     0.58      0.09       0.80     0.51      0.66       0.80
 6:     0.25      0.05       0.45     0.75      0.71       0.71
 7:     0.09      0.88       0.74     0.72      0.18       0.82
 8:     0.33      0.94       0.88     0.74      0.24       0.90
 9:     0.73      0.63       0.89     0.39      0.97       0.29
10:     0.50      0.04       0.55     0.66      0.21       0.32

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM