R 将值指定给列名是其他列值串联的列

R 将值指定给列名是其他列值串联的列,r,tidyverse,R,Tidyverse,假设以下数据: dat <- structure(list(row = c("467", "537", "236", "257"), x_11 = c(5, 5, 5, 4), x_12 = c(5, 5, 6, 1), x_13 = c(4, 7, 6, 5), x_14 = c(4, 6, 4, 1), x_15 = c(4, 5, 4, 4), x_16 = c(2, 6, 5, 2), x_17 =

假设以下数据:

dat <- structure(list(row = c("467", "537", "236", "257"), x_11 = c(5, 
5, 5, 4), x_12 = c(5, 5, 6, 1), x_13 = c(4, 7, 6, 5), x_14 = c(4, 
6, 4, 1), x_15 = c(4, 5, 4, 4), x_16 = c(2, 6, 5, 2), x_17 = c(3, 
4, 3, 3), mode_1 = c(4, 5, 4, 1), mode_2 = c(NA, NA, 5, 4), mode_3 = c(NA, 
NA, 6, NA), mean = c(3.85714285714286, 5.42857142857143, 4.71428571428571, 
2.85714285714286), sd = c(1.0690449676497, 0.975900072948533, 
1.11269728052837, 1.57359158493889), nearest = c(1L, 1L, 2L, 
2L)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"
))
预期产出:

# A tibble: 4 x 15
  row       [...] mode_1 mode_2 mode_3  mean    sd nearest  test
  <chr>     [...]  <dbl>  <dbl>  <dbl> <dbl> <dbl>   <int> <int>
1 467       [...]      4     NA     NA  3.86 1.07        1     4
2 537       [...]      5     NA     NA  5.43 0.976       1     5
3 236       [...]      4      5      6  4.71 1.11        2     5
4 257       [...]      1      4     NA  2.86 1.57        2     4

注意,实际上我有~20-50个模式列,因此我无法硬编码所有可能的组合。

您可以创建一个新列,该列具有take和use coalesce中的相应值,以选择任何一个非NA值

library(dplyr)
dat %>%
  mutate(take_value = as.numeric(.[cbind(1:n(),
                                   match(paste0('x_', take), names(.)))]),
         test = coalesce(take_value, x_1)) %>%
  select(-take_value)

#  x_1 x_2 take test
#1   1  NA    2    1
#2   9   2    1    9
#3   3  NA    2    3
#4   7   8    2    8
#5   5  NA    1    5
使用基本R:

dat$take_value <- dat[cbind(1:nrow(dat), match(paste0('x_', dat$take), names(dat)))]
transform(dat, test = ifelse(is.na(take_value), x_1, take_value))

这假设x_1、x_2列是第一列,以便您可以通过它们的列位置访问它们。如果我在x_1和x_2之前有一些其他列,或者更一般的列,它将如何工作:通过名称访问这些列,它将如何工作?不……这假设有必须从中获取值的列号。take实际上有什么?因此take有x列的列位置,而不是数据帧的整体列位置。对不起,我在我的帖子中说得更清楚了。仍然有一个错误,可能是因为我的玩具数据集没有显示我真实数据集的全部复杂性。我想在我的帖子中更新我的输入数据框。你得到了什么错误?在您提供的示例中,这对您有用吗?您的实际数据与您共享的示例有何不同?在x_1和x_2的位置上,您的实际列名是什么?
library(dplyr)
dat %>%
  mutate(take_value = as.numeric(.[cbind(1:n(),
                                   match(paste0('x_', take), names(.)))]),
         test = coalesce(take_value, x_1)) %>%
  select(-take_value)

#  x_1 x_2 take test
#1   1  NA    2    1
#2   9   2    1    9
#3   3  NA    2    3
#4   7   8    2    8
#5   5  NA    1    5
dat$take_value <- dat[cbind(1:nrow(dat), match(paste0('x_', dat$take), names(dat)))]
transform(dat, test = ifelse(is.na(take_value), x_1, take_value))