gpt4 book ai didi

r - 在 R 中,当每个观测值位于不同变量中时如何对观测值进行计数

转载 作者:行者123 更新时间:2023-12-02 15:43:28 27 4
gpt4 key购买 nike

我有一个数据集,其中对一个事件的观察发生在不同的变量中。为了举一个更清楚的例子,想象一下: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))

数据看起来像这样

enter image description here

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

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

我的第一个想法是使用“unite”,然后重新排列,使每棵树都按相同的顺序排列,然后创建一个新变量。然而我并没有成功,而且由于存在 NA,事实证明它仍然有点困难。

预期结果: enter image description here

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

最佳答案

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

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

然后我们可以使用pivot_wider在您想要的输出中创建存在/不存在矩阵:

tree_wide <- treedata_long %>% 
select(-tree_num) %>%
pivot_wider(names_from = tree_name, values_from = tree_name, values_fn = \(x) ifelse(!is.na(x), 'yes', NA))

ID birch oak sequoia alder
<dbl> <chr> <chr> <chr> <chr>
1 1 yes yes yes yes
2 2 NA yes yes NA
3 3 yes yes NA yes
4 4 yes yes yes yes

关于r - 在 R 中,当每个观测值位于不同变量中时如何对观测值进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75250759/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com