r 数据框 - 将值转换为文本并按每行出现次数从最多到最少的顺序排列

r data frame- convert values to text and rank from most to least occurrences per row

R 新手,在将公式从 excel 转换为 R 时遇到问题。任何建议都很好。 我有一个名为 allwins_df 的数据框,我想在其中将每个值更改为列名的第一个字母。

然后我需要计算每个字母在每个日期出现的次数,并将它们从出现次数从高到低排列。最后,如果出现平局,则获胜者是基础数字最大的字母。即在 2001 年 1 月 5 日,其中一个 B 值的值高于 A,因此首先是 B,然后是 A,然后是 C。数据帧示例:

Date        A.B  A.C  B.A   B.C  C.A  C.B…
2001-01-01  N/A  NA   0.14  0.35 0.43 NA
2001-01-02  0.8  NA   NA    0.5  NA   0.32
2001-01-03  0.75 0.8  NA    0.65 NA   0.9
2001-01-04  NA   0.66 0.91  NA   NA   NA
2001-01-05  0.52 0.62 0.48  0.82 0.4  NA

在一些帮助下,我使用以下代码将值转换为字母,但不确定我是否可以使用生成的输出对出现次数从最多到最少进行排序并处理平局。

 cols <- sub("\..*", "",names(allwins_df)[-1])
    mat <- which(!is.na(allwins_df[-1]), arr.ind = TRUE)
    allwins_df[-1][mat]<- allwins_df[-1][mat] <- cols[mat[, 2]]

以上代码的输出 - 仅将值更改为字母:

Date        A.B A.C B.A B.C C.A C.B…
2001-01-01  N/A NA  B   B   C   NA
2001-01-02  A   A   NA  B   NA  C
2001-01-03  A   A   NA  B   NA  C
2001-01-04  NA  A   B   NA  NA  NA
2001-01-05  A   A   B   B   C   NA

最终目标输出示例:

Date            
2001-01-01  B   C   
2001-01-02  A   B   C
2001-01-03  A   C   B
2001-01-04  B   A   
2001-01-05  B   A   C

提前致谢。

这是 tidyversetidyrdplyr

的可能策略

使用数据

dd<-read.table(text="Date        A.B  A.C  B.A   B.C  C.A  C.B
2001-01-01  N/A  NA   0.14  0.35 0.43 NA
2001-01-02  0.8  NA   NA    0.5  NA   0.32
2001-01-03  0.75 0.8  NA    0.65 NA   0.9
2001-01-04  NA   0.66 0.91  NA   NA   NA
2001-01-05  0.52 0.62 0.48  0.82 0.4  NA", header=TRUE, na.strings=c("NA","N/A"))

我们可以做到以下几点

library(tidyr)
library(dplyr)
dd %>% 
  pivot_longer(-Date) %>% 
  separate(name, c("first","second")) %>% 
  group_by(Date, first) %>% 
  filter(!is.na(value)) %>% 
  summarize(count=n(), max=max(value)) %>% 
  arrange(Date, desc(count), desc(max)) %>% 
  mutate(rank=row_number()) %>% 
  pivot_wider(Date, names_from=rank, values_from=first, values_fill=NA)

哪个returns

  Date       `1`   `2`   `3`  
  <chr>      <chr> <chr> <chr>
1 2001-01-01 B     C     NA   
2 2001-01-02 A     B     C    
3 2001-01-03 A     C     B    
4 2001-01-04 B     A     NA   
5 2001-01-05 B     A     C   

我们的想法是将数据重塑为更整洁的格式。在这里,我们将这些列变成行。然后把名字分开,这样我们就可以只看第一个字母了。然后我们计算它们并跟踪每个更好的最大值。我们对它们进行分类,然后将它们重塑为与您想要的形状相匹配的宽幅面。尽管您可能需要重新考虑,因为这样的形状在 R 中并不总是很容易处理。“整洁”数据通常是“矩形”,其中每行具有相同数量的列。像这样参差不齐的数据并不漂亮,但这完全取决于您要在下游做什么。

请注意,通常您要小心尝试将代码从 excel 直接转换为 R。这两个程序的工作方式非常不同,有时解决相同的问题会涉及非常不同的策略以提高效率不同的环境。

MrFlick 解决了我的问题。我将日期向量与 Mrflick 的输出合并,得到了我想要的结果。现在下期