r-如何创建一个新列,对另一列的行中的特定值进行计数



我在R中的数据帧,具有ID和值:

ID = c(1,2,3,1,2,3,1,2,3,1)
Value= c("N","1","2","3","5","6","7","N","1","2")
df = data.frame(ID, Value)

我想创建三个新的专栏,一个叫讲台,一个叫做完成,一个叫作丢失。如果值为1,2或3,我希望每个ID的讲台都能计数。如果值为"0",则我希望丢失每个ID;\N〃;剩下的要计入的就结束了。

基本上,我希望输出看起来像这样:

ID = c(1,2,3)
Podium = c(2,1,2)
Finished = c(1,1,1)
Lost=c(1,1,0)
df = data.frame(ID, Podium, Finished, Lost)

这是可行的,但首先要提醒您使用"\N〃;。字符串中的后斜杠表示转义字符;\N〃;不是转义字符的可识别代码,当我尝试再现数据帧df:时,R抛出以下错误

Error: 'N' is an unrecognized escape in character string starting ""N"

为了解决这个问题,我在您的示例中删除了反斜杠。我建议您也对这部分数据进行重新编码,这样您就不会在以后的分析中遇到由转义字符引起的问题。

这样一来,您的问题本身就有了一个简单的解决方案,使用{tidyverse}包中的函数:

library(tidyverse)
# Your original data
df = data.frame(
ID = c(1,2,3,1,2,3,1,2,3,1), 
Value = c("N","1","2","3","5","6","7","N","1","2")
)
result <- df %>%
as_tibble() %>%
mutate(Value = as.character(Value)) %>%
group_by(ID) %>%
summarise(
Podium = sum(Value <= 3),
Finished = sum(Value != "N" & Value > 3),
Lost = sum(Value == "N")
)

这样,你的结果看起来像:

ID Podium Finished  Lost
<dbl>  <int>    <int> <int>
1      2        1     1
2      1        1     1
3      2        1     0
library(dplyr); library(tidyr)
df %>% 
mutate(Value = case_when(
Value %in% 1:3 ~ "Podium",
Value == "N" ~ "Lost",
TRUE ~ "Finished"
)) %>%
count(ID, Value) %>%
pivot_wider(names_from = Value, values_from = n, values_fill = 0)

在这里,我使用dplyr::case_when将Value转换为所提供的类别,然后使用dplyr::count对组合进行计数,再使用tidyr::pivot_wider将结果转换为更宽的格式。

相关内容

  • 没有找到相关文章

最新更新