R语言 从数据集年份中选择该年份的相应列

whlutmcx  于 2023-02-27  发布在  其他
关注(0)|答案(4)|浏览(156)

我有以下 Dataframe :
| 面积|年份|成功_第1年|成功_第2年|成功_第3年|
| - ------|- ------|- ------|- ------|- ------|
| 六个|1个|1个|第二章|四个|
| 七|第二章|第二章|三个|1个|
| 三十三|三个|三个|第二章|1个|
| 四十四|1个|第二章|1个|四个|
| 二十三|第二章|第二章|三个|1个|
| 五十三|三个|1个|第二章|四个|
现在我想得到一个单独的列,只在一年中的一年列中成功。像这样:
| 面积|年份|成功|
| - ------|- ------|- ------|
| 六个|1个|1个|
| 七|第二章|三个|
| 三十三|三个|1个|
| 四十四|1个|第二章|
| 二十三|第二章|三个|
| 五十三|三个|四个|
我该怎么做?加入之类的?选择如果?
我寻找的是

data_match <- data[ , grep("col", colnames(data))]

但这样就不会遍历行了。

z31licg0

z31licg01#

可以使用2列矩阵进行索引:

df[grep("Success", names(df))][cbind(seq_len(nrow(df)), df$Year)]

# [1] 1 3 1 2 3 4

dplyr工作流程:

library(dplyr)

df %>%
  mutate(Sucess = as.data.frame(pick(starts_with("Success")))[cbind(row_number(), Year)])

#   Area Year Success_Year1 Success_Year2 Success_Year3 Sucess
# 1    6    1             1             2             4      1
# 2    7    2             2             3             1      3
# 3   33    3             3             2             1      1
# 4   44    1             2             1             4      2
# 5   23    2             2             3             1      3
# 6   53    3             1             2             4      4

注意:pick(...)周围的as.data.frame是必需的,因为pick(...)返回一个tbl_df对象,该对象不支持矩阵索引。

使用case_match的替代方法:

df %>%
  mutate(Success = case_match(Year,
                              1 ~ Success_Year1,
                              2 ~ Success_Year2,
                              3 ~ Success_Year3,
                              .default = NA))
wj8zmpe1

wj8zmpe12#

使用sapply执行矢量化grep,使用cbind按行执行索引:

data$success <- data[cbind(1:nrow(data), sapply(data$Year, grep, colnames(data)))]
cbind(data[1:2], 
      success = data[cbind(1:nrow(data), sapply(data$Year, grep, colnames(data)))])
#  Area Year success
#1    6    1       1
#2    7    2       3
#3   33    3       1
#4   44    1       2
#5   23    2       3
#6   53    3       4
falq053o

falq053o3#

使用旋转(此处使用tidyr/dplyr):

library(dplyr)
library(tidyr)

data |>
  pivot_longer(starts_with("Sucess_Year"),
               names_prefix = "Sucess_Year",
               values_to = "Sucess",
               names_to = "YearCol") |>
  filter(Year == YearCol) |>
  select(-YearCol)

输出:

# A tibble: 6 × 3
   Area  Year Sucess
  <dbl> <dbl>  <dbl>
1     6     1      1
2     7     2      3
3    33     3      1
4    44     1      2
5    23     2      3
6    53     3      4
e5nqia27

e5nqia274#

嗨,谢谢你的答案!它们没有像预期的那样工作,但我找到了自己的解决方案:

Datatable %>%
  mutate(Success = ifelse(Year == 1, Success_Year1,
                          ifelse(Year == 2 Success_Year2,
                                 ifelse(Year == 3, Success_Year3,
                                        ifelse(Year == 4, Success_Year4, NA)))))

相关问题