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))