【问题标题】:In R, how to count observations when each observation is in a different variable在 R 中,当每个观察值在不同的变量中时如何计算观察值
【发布时间】:2023-01-27 03:31:58
【问题描述】:

我有一个数据集,其中对一个事件的观察发生在不同的变量中。举一个更清楚的例子,想象一下: 4 人被告知到树林里去登记树木。他们被告知按照偶然发现树的顺序记下树的类型。因此,每个人交出他们找到的第一到第四棵树的清单。它产生了这个数据框:

treedata <- structure(list(ID = c(1, 2, 3, 4), Tree_1 = c("birch", "oak", 
"oak", "alder"), Tree_2 = c("oak", "sequoia", "birch", "oak"), 
    Tree_3 = c("sequoia", NA, "alder", "birch"), Tree_4 = c("alder", 
    NA, NA, "sequoia")), class = "data.frame", row.names = c(NA, 
4L))

数据看起来像这样

然后数据科学家被告知计算每种树类型的观察次数。但问题是,例如“birch”出现在 ID 1 的变量“Tree_1”中,ID 3 的“Tree_2”和 ID 4 的“Tree_3”中。

基本上我想在这里做的是将 Tree_x 变量转换为“birch”变量、“oak”变量等等,然后如果 ID 偶然发现了那棵树,则分配一个值 Yes 或 No。除了计算树木之外,新变量还将用于将树木与数值变量相关联。

我的第一个想法是使用“联合”,然后重新排列,使每棵树的顺序相同,然后创建一个新变量。但是我没有成功,因为有 NA,所以还是有点困难。

预期结果:

有没有人有办法解决吗?我试过谷歌搜索和搜索,但没有任何运气。

【问题讨论】:

  • 请显示您对该示例的预期输出
  • 谢谢你。使用预期输出编辑帖子。但是不确定我是否要在空单元格中显示“NA”或“否”。

标签: r


【解决方案1】:

如果您能够使用整洁宇宙包,第一步是将数据转换为长格式折叠树列的折叠:

library(tidyverse)

treedata_long <- pivot_longer(treedata, -ID, names_to = 'tree_num', values_to = 'tree_name') %>% 
  filter(!is.na(tree_name))

      ID tree_num tree_name
   <dbl> <chr>    <chr>    
 1     1 Tree_1   birch    
 2     1 Tree_2   oak      
 3     1 Tree_3   sequoia  
 4     1 Tree_4   alder    
 5     2 Tree_1   oak      
 6     2 Tree_2   sequoia  
 7     3 Tree_1   oak      
 8     3 Tree_2   birch    
 9     3 Tree_3   alder    
10     4 Tree_1   alder    
11     4 Tree_2   oak      
12     4 Tree_3   birch    
13     4 Tree_4   sequoia 

那么使用count()函数就简单了:

tree_counts <- count(treedata_long, tree_name)

  tree_name     n
  <chr>     <int>
1 alder         3
2 birch         3
3 oak           4
4 sequoia       3

【讨论】:

  • 谢谢!这是计算观察结果的一个很好的解决方案,它有很大帮助。但是,我还想为每棵树设置一个变量,如果该树被该 ID 发现,则可以。如果我的问题不清楚,我很抱歉。我已经按照 akrun 的建议使用所需的输出对其进行了更新。
猜你喜欢
  • 2013-12-03
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2012-07-19
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多