R语言 无法指定带有空格的列名

93ze6v8z  于 2023-04-18  发布在  其他
关注(0)|答案(3)|浏览(176)

尽管post显示可以使用反勾号```来选择名称中有空格的列,但在下面的代码中我无法这样做

library(tidyverse)
library(survival)

df <- colon[colon$etype==2, c("time", "age")]
num_summary <- do.call(cbind, lapply(df, summary)) %>% 
  t() %>% mutate(Interquatrile = `3rd Qu.` - `1st Qu.`)

这将导致以下错误

Error in UseMethod("mutate") : 
  no applicable method for 'mutate' applied to an object of class "c('matrix', 'array', 'double', 'numeric')"

你能解释一下我做错了什么,以及如何在不重命名列名的情况下解决这个问题吗?

brccelvz

brccelvz1#

正如在另一个答案中提到的,这与列名无关,而与cbind(以及t)默认创建 matrix 而不是data. frame这一事实有关。
要创建一个表,你根本不需要通过矩阵(和as_tibble)来绕路-相反,使用bind_cols,或者在你的情况下(省略t()),bind_rows

num_summary <- lapply(df, summary) %>%
  bind_rows() %>%
  mutate(Interquartile = `3rd Qu.` - `1st Qu.`)

上面的代码保留了汇总表的类和属性。这是无害的,但是如果你想去掉无关的属性,只想保留纯数值,你可以对所有列应用as.vector(或c)来实现:

num_summary <- lapply(df, summary) %>%
  bind_rows() %>%
  mutate(across(everything(), as.vector)) %>%
  mutate(Interquartile = `3rd Qu.` - `1st Qu.`)
bf1o4zei

bf1o4zei2#

它与你的列无关,而是与你的一般数据结构有关:
使用as_tibble()将矩阵转换为tibble( Dataframe ),这样您就可以使用mutate函数:

do.call(cbind, lapply(df, summary)) %>% 
  t() %>% 
  as_tibble() %>% 
  mutate(Interquatrile = `3rd Qu.` - `1st Qu.`)

输出:

# A tibble: 2 × 7
   Min. `1st Qu.` Median   Mean `3rd Qu.`  Max. Interquatrile
  <dbl>     <dbl>  <dbl>  <dbl>     <dbl> <dbl>         <dbl>
1    23       806   1976 1670.       2364  3329          1558
2    18        53     61   59.8        69    85            16
sycxhyv7

sycxhyv73#

您使用matrix调用mutate,但mutate需要data.frame
也许你使用rbind而不是cbindt,并将matrix转换为data.framemutate可以使用它。

do.call(rbind, lapply(df, summary)) %>% 
  as.data.frame %>% mutate(Interquatrile = `3rd Qu.` - `1st Qu.`)
#     Min. 1st Qu. Median       Mean 3rd Qu. Max. Interquatrile
#time   23     806   1976 1669.95587    2364 3329          1558
#age    18      53     61   59.75457      69   85            16

或者你的代码通过使用as.data.frame

do.call(cbind, lapply(df, summary)) %>% 
  t() %>% as.data.frame %>% mutate(Interquatrile = `3rd Qu.` - `1st Qu.`)
#     Min. 1st Qu. Median       Mean 3rd Qu. Max. Interquatrile
#time   23     806   1976 1669.95587    2364 3329          1558
#age    18      53     61   59.75457      69   85            16

或者跳过将data.framecbindInterquatrile 转换为矩阵。

do.call(rbind, lapply(df, summary)) %>%
  cbind(., Interquatrile = .[,"3rd Qu."] - .[,"1st Qu."])
#     Min. 1st Qu. Median       Mean 3rd Qu. Max. Interquatrile
#time   23     806   1976 1669.95587    2364 3329          1558
#age    18      53     61   59.75457      69   85            16

或者直接在lapply调用的函数中执行,并获得matrix,如果需要,可以将其转换为data.frame

do.call(rbind,
        lapply(df, function(x) {
          y <- summary(x)
          c(y, Interquatrile = y[["3rd Qu."]] - y[["1st Qu."]])} ))
#     Min. 1st Qu. Median       Mean 3rd Qu. Max. Interquatrile
#time   23     806   1976 1669.95587    2364 3329          1558
#age    18      53     61   59.75457      69   85            16

相关问题