pivot_wider导致“!无法对不存在的列进行子集化,”R中出错

4dc9hkyq  于 2023-03-15  发布在  其他
关注(0)|答案(3)|浏览(174)

我有一些数据要在R中透视。但是当我运行代码时,我得到了一个无法子集化不存在的列的错误。我的数据目前看起来像这样,但是,有数百个不同的标题,而不是像下面我的简化数据看起来的那样只有三个。

ID    Title         Training_Time    Percent_Complete

1     New             1                    100
1     Hazmat          5                    100
1     Management      12                   100

我希望它看起来像这样,如果可能的话,还包括完成百分比列,尽管我可以凑合着用几天的时间来完成培训,就像我下面的。

ID    Training_New     Training_Hazmat          Training_Managerment

1         1                   5                        12

基于stackoverflow对类似问题的回答,我尝试了下面代码的几个不同版本。

LMS_df <- LMS_df %>%
tidyr::pivot_wider(-ID,
  names_from = LMS_df$Title,
  values_from = LMS_df$Training_Time
)

有什么建议可以消除这个错误吗?我需要为数据集中的每个培训标题创建新列吗?

mec1mxoz

mec1mxoz1#

下面是一个可复制的小例子,来自于原创者提供的数据。不需要美元语法的数据框名称(即LMS_df$)。没有美元语法,它就可以工作到目前为止。可以用names_prefix = "Training_"添加名称前缀:

library(dplyr)
library(tidyr)

df <- tribble(
~ID,    ~Title,       ~Training_Time,  ~Percent_Complete,
1,     "New",         1,                100,
1,     "Hazmat",      5,                100,
1,     "Management",  12,               100
)

df %>%
  pivot_wider(-ID,
    names_from = Title,
    values_from = Training_Time,
    names_prefix = "Training_"
  )
#> # A tibble: 1 × 4
#>   Percent_Complete Training_New Training_Hazmat Training_Management
#>              <dbl>        <dbl>           <dbl>               <dbl>
#> 1              100            1               5                  12

创建于2023年3月9日,使用reprex v2.0.2
最后一点:这是一种特殊情况,因为对于所有TitlePercent_Complete都等于100。否则,您将为每个百分比获得单独的行,并为所有不匹配的情况获得NA

cmssoen2

cmssoen22#

一种可能的方法是:

library(dplyr)
library(tidyr)
df %>% 
  pivot_wider(names_from = Title,
              values_from = Training_Time, 
              names_glue = "Training_{Title}") %>% 
  select(-ID)
Percent_Complete Training_New Training_Hazmat Training_Management
             <int>        <int>           <int>               <int>
1              100            1               5                  12
xwbd5t1u

xwbd5t1u3#

data.table的选项

library(data.table)
 dcast(setDT(df), Percent_Complete ~ paste0("Training_", Title), value.var = "Training_Time")
  • 输出
Percent_Complete Training_Hazmat Training_Management Training_New
1:              100               5                  12            1

相关问题