【问题标题】:Counting new levels of a factor per site (R)计算每个站点的因子的新水平 (R)
【发布时间】:2021-12-15 09:23:12
【问题描述】:

我需要生成一个表格,计算每个站点的因子的新水平。 我的代码是这样的

# Data creation
f = c("red", "green", "blue", "orange", "yellow")
f = factor(f)
d = data.frame(
  site = 1:10,
  color1= c(
    "red", "red", "green", "green",  "green", 
    "blue","green", "blue", "orange", "yellow"
  ),
  color2= c(
    "green", "green",  "green", "blue","green", 
    "blue", "orange", "yellow","red", "red"
  )
)
d$color1 = factor( d$color1 , levels = levels(f) )
d$color2 = factor( d$color2 , levels = levels(f) )
d

它显示了这张桌子

我需要计算每个新站点中有多少新颜色。只计算第一次出现,不重复。生成了一个像这样的表。

在此图中计算每个站点不重复的颜色。

是否有 dplyr 方法可以找到此输出?

【问题讨论】:

  • 谢谢@Nuclear0302704 我也认为可以使用未重复或类似命令的变体,但没有成功。
  • 您能否澄清一下您的意思是计算“每个站点不重复”?因为如果您确实在寻找每个站点,那么也在例如第 2 行两个值都不重复。
  • 谢谢@deschen,第二行是 0,因为它们不是新颜色。我们算在第 1 行。新颜色在第 4 行和第 7 行...
  • 但为什么第 9 行出现了新颜色?橙色已经在第 7 行,红色已经在第 1 行。
  • 是的,你是对的。 newColors 中的第 9 行应为 0。

标签: r dplyr counting factors levels


【解决方案1】:

你可以这样做:

library(tidyverse)
d %>%
  pivot_longer(cols = -site) %>%
  mutate(newColors = duplicated(value)) %>%
  group_by(site) %>%
  mutate(newColors = sum(!newColors)) %>%
  ungroup() %>%
  pivot_wider()

给出:

# A tibble: 10 x 4
    site newColors color1 color2
   <int>     <int> <fct>  <fct> 
 1     1         2 red    green 
 2     2         0 red    green 
 3     3         0 green  green 
 4     4         1 green  blue  
 5     5         0 green  green 
 6     6         0 blue   blue  
 7     7         1 green  orange
 8     8         1 blue   yellow
 9     9         0 orange red   
10    10         0 yellow red   

请注意,这与第 9 行不同,其中您有一个 1,但两种颜色(橙色和红色)都已出现在前面的行中。

【讨论】:

  • 这是一个解决方案@deschen。谢谢!!!当然,我在第 9 行弄错了。多谢!!!
  • 好的。如果答案有帮助,请随时投票和/或将其标记为您接受的答案,以便其他人看到问题有解决方案。
  • 我接受了你的回答。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多