【问题标题】:create another column with yes/no value [duplicate]创建另一个具有是/否值的列[重复]
【发布时间】:2020-10-20 10:32:19
【问题描述】:

我有一个数据集,我想为其创建一个名称为 smallmediumlarge 的新列,这些将取决于年份 2014 的值。其中1:5 = small6:9 = medium10:14 = large。值将是 yesno,具体取决于年份的值。

这就是我的数据集的样子:

 A tibble: 330 x 4
   LOC_ID     season `2014` `2015`
   <chr>      <chr>   <int>  <int>
 1 LOC1002793 Summer     12     NA
 2 LOC1002793 Winter      6     NA
 3 LOC1004001 Winter     NA      1
 4 LOC1004488 Winter      8     NA
 5 LOC1012349 Summer     12     12
 6 LOC1012349 Winter     11     12
 7 LOC1019836 Summer     14     10
 8 LOC1019836 Winter     12     12
 9 LOC1022032 Winter     NA      1
10 LOC1034172 Summer     13     11
# ... with 320 more rows

计数分为 2014 年和 2015 年,这些计数表示一年中,在该季节的几周内,locality id 进行观察的次数(在这种情况下,观察是鸟类)。

我想要这样的东西(我会将 2014/2015 数据帧分成两个数据帧,所以这样做一年我可以复制另一个的代码):

 A tibble: 330 x 4
   LOC_ID     season `2014` `2015`  small    medium   large
   <chr>      <chr>   <int>  <int>
 1 LOC1002793 Summer     12     NA   no        no      yes
 2 LOC1002793 Winter      6     NA   no        yes      no
 3 LOC1004001 Winter     NA      1   
 4 LOC1004488 Winter      8     NA   no        yes      no
 5 LOC1012349 Summer     12     12   no        no      yes
 6 LOC1012349 Winter     11     12   .         .        .
 7 LOC1019836 Summer     14     10   .         .        .
 8 LOC1019836 Winter     12     12
 9 LOC1022032 Winter     NA      1
10 LOC1034172 Summer     13     11
# ... with 320 more rows

这是我尝试过的:

#replicate the years and name those replicates test1 = 2014 and test2 = 2015
A tibble: 330 x 6
   LOC_ID     season test1 `2014` test2 `2015`
   <chr>      <chr>  <int>  <int> <int>  <int>
 1 LOC1002793 Summer    12     12    NA     NA
 2 LOC1002793 Winter     6      6    NA     NA
 3 LOC1004001 Winter    NA     NA     1      1
 4 LOC1004488 Winter     8      8    NA     NA
 5 LOC1012349 Summer    12     12    12     12
 6 LOC1012349 Winter    11     11    12     12
 7 LOC1019836 Summer    14     14    10     10
 8 LOC1019836 Winter    12     12    12     12
 9 LOC1022032 Winter    NA     NA     1      1
10 LOC1034172 Summer    13     13    11     11
# ... with 320 more rows

ld <- d %>% mutate(test1 = recode(test1, `1:5` = 'low', `6:9` = 'medium', `10:14` = 'high')) %>% pivot_wider(names_from = test1, values_from = '2014')

可重现的代码:

structure(list(LOC_ID = c("LOC1002793", "LOC1002793", "LOC1004001", 
"LOC1004488", "LOC1012349", "LOC1012349", "LOC1019836", "LOC1019836", 
"LOC1022032", "LOC1034172", "LOC1034172", "LOC1039789", "LOC1040038", 
"LOC1040038", "LOC1047222314194", "LOC1047222314194", "LOC1048553080056", 
"LOC1049318", "LOC1049318", "LOC1049970899816", "LOC1049970899816", 
"LOC1066628", "LOC1066628", "LOC1071566", "LOC1071566", "LOC1071569", 
"LOC1071569", "LOC1073191", "LOC1073191", "LOC1073423", "LOC1073423", 
"LOC1079978", "LOC1079978", "LOC1083442", "LOC1083442", "LOC1086293", 
"LOC1086293", "LOC1087213", "LOC1087213", "LOC1088795", "LOC1088795", 
"LOC1122438", "LOC1122438", "LOC1139319877260", "LOC1139319877260", 
"LOC1153084541859", "LOC1153084541859", "LOC1155749", "LOC1163128", 
"LOC1163128", "LOC1234081", "LOC1234081", "LOC1289919", "LOC1289919", 
"LOC1294966340210", "LOC1300602115", "LOC1300602115", "LOC1300602122", 
"LOC1300602122", "LOC1300602135", "LOC1300602135", "LOC1300602161", 
"LOC1300602161", "LOC1300602184", "LOC1300602184", "LOC1300602196", 
"LOC1300602196", "LOC1300602243", "LOC1300602243", "LOC1300602306", 
"LOC1300602306", "LOC1300604079", "LOC1300604079", "LOC1300604135", 
"LOC1300604135", "LOC1300604635", "LOC1300604635", "LOC1300604699", 
"LOC1300604699", "LOC1300604713"), season = c("Summer", "Winter", 
"Winter", "Winter", "Summer", "Winter", "Summer", "Winter", "Winter", 
"Summer", "Winter", "Winter", "Summer", "Winter", "Summer", "Winter", 
"Summer", "Summer", "Winter", "Summer", "Winter", "Summer", "Winter", 
"Summer", "Winter", "Summer", "Winter", "Summer", "Winter", "Summer", 
"Winter", "Summer", "Winter", "Summer", "Winter", "Summer", "Winter", 
"Summer", "Winter", "Summer", "Winter", "Summer", "Winter", "Summer", 
"Winter", "Summer", "Winter", "Winter", "Summer", "Winter", "Summer", 
"Winter", "Summer", "Winter", "Winter", "Summer", "Winter", "Summer", 
"Winter", "Summer", "Winter", "Summer", "Winter", "Summer", "Winter", 
"Summer", "Winter", "Summer", "Winter", "Summer", "Winter", "Summer", 
"Winter", "Summer", "Winter", "Summer", "Winter", "Summer", "Winter", 
"Summer"), `2015` = c(NA, NA, 1L, NA, 12L, 12L, 10L, 12L, 1L, 
11L, 12L, NA, 2L, 5L, 11L, 9L, NA, 5L, 7L, 13L, 12L, 9L, 11L, 
9L, 11L, 11L, 7L, 7L, 12L, 8L, 12L, 12L, 7L, 13L, 12L, 12L, 12L, 
4L, 8L, 7L, 10L, 7L, 4L, 12L, 12L, 2L, 5L, NA, NA, 9L, 12L, 7L, 
11L, 4L, 8L, 11L, 12L, 13L, 12L, 10L, 12L, 12L, 12L, 11L, 4L, 
13L, 12L, 12L, 12L, 10L, 10L, 11L, 10L, 12L, 11L, 9L, 11L, 9L, 
10L, 13L)), row.names = c(NA, -80L), class = c("tbl_df", "tbl", 
"data.frame"))

【问题讨论】:

  • 您可以运行dput(head(data, 10)) 并将输出粘贴到问题中吗?这样可以更轻松地将您的数据复制到 R 中,以便我们与您一起为您提供最佳答案。
  • 哎呀我本来打算这样做的,现在看看

标签: r


【解决方案1】:

这是tidyverse的方式。

library(dplyr)
library(tidyr)

data %>% 
  mutate(names = cut(`2014`,    # cut converts a numeric vector into a factor
                     breaks = c(1, 5, 9, 14), 
                     labels = c("small", "medium", "large")),
         values = if_else(is.na(names), "NA" , "yes")) %>%   # adds your "yes" values
  pivot_wider(names_from = names, 
              values_from = values) %>%  # makes the cut labels into columns
  select(-`NA`) %>% # an undesired `NA` column was created and needs to be removed
  mutate(across(large:small, 
                ~replace_na(., "no"))) # replace NA values with "no"

# A tibble: 50 x 7
   LOC_ID     season `2014` `2015` large medium small
   <chr>      <chr>   <int>  <int> <chr> <chr>  <chr>
 1 LOC1002793 Summer     12     NA yes   no     no   
 2 LOC1002793 Winter      6     NA no    yes    no   
 3 LOC1004001 Winter     NA      1 no    no     no   
 4 LOC1004488 Winter      8     NA no    yes    no   
 5 LOC1012349 Summer     12     12 yes   no     no   
 6 LOC1012349 Winter     11     12 yes   no     no   
 7 LOC1019836 Summer     14     10 yes   no     no   
 8 LOC1019836 Winter     12     12 yes   no     no   
 9 LOC1022032 Winter     NA      1 no    no     no   
10 LOC1034172 Summer     13     11 yes   no     no   
# ... with 40 more rows

【讨论】:

  • 不应该 NA 在 3 个“大小”列中触发空白“”而不是“否”吗?无论如何优雅的答案
  • 这适用于 2014 年,尽管在 2015 年它无法为 yes 提供给定 1 的值,它还在中等列上返回许多 NAs 而不是 no .如果你想看看,我已经更新了 2015 年的 dput 代码。
  • 我想办法用这个year_2015[which(year_2015[,4]== 1, ), 6] &lt;- "yes" 将值1 转换成no 并用data[is.na(data)] &lt;- "no" 替换NAs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2023-03-13
  • 2015-03-10
  • 1970-01-01
  • 2021-08-22
  • 2022-01-23
  • 2019-05-26
相关资源
最近更新 更多