在行名称中使用 grep 剪切数据框

问题描述

我有这个数据框,我正在尝试从第一列创建一个新的数据框。

> dput(test)
structure(list(r = structure(c(1,-0.242175528061635,-0.0666583192103071,0.747898462006041,-0.273127322801604,-0.854174676122907,-0.326472398494847,1,0.610093319116511,-0.716174286974882,0.369971592520776,0.508225738755394,-0.696867613186299,-0.701926352509189,-0.38572193914295,-0.559677556010383,-0.125875964382533,0.269630040258706,-0.614852282668006,0.230479322245116,0.0600998872561921,0.116913308995612,0.0794305579734066,1),.Dim = c(7L,7L),.Dimnames = list(c("Age0","Age1","Age2","Age3","Age4","Age5","Age6"),c("Age0","Age6"))),n = structure(c(11L,10L,9L,7L,6L,5L,5L),P = structure(c(NA,0.500232797835481,0.864706601629758,0.0532193933767151,0.553424124702133,0.0303470480407344,0.591829340417803,NA,0.0810438517167933,0.0702490823574873,0.414004850479571,0.303297069271903,0.19097470996879,0.078730337182463,0.392783486027188,0.248140075649853,0.840153996654778,0.605356039921348,0.193941978043868,0.709163811251702,0.909958709405365,0.851481168303219,0.898972319533829,NA),.Dimnames = list(
    c("Age0","Age6")))),class = "rcorr")

我使用 do.call 和 rbind 转换为数据帧

test <- do.call(rbind.data.frame,test)
> dput(test)
structure(list(Age0 = c(1,11,10,9,7,6,5,0.591829340417803
),Age1 = c(-0.242175528061635,0.19097470996879
),Age2 = c(-0.0666583192103071,0.840153996654778
),Age3 = c(0.747898462006041,0.709163811251702),Age4 = c(-0.273127322801604,0.851481168303219),Age5 = c(-0.854174676122907,0.898972319533829),Age6 = c(-0.326472398494847,NA)),row.names = c("r.Age0","r.Age1","r.Age2","r.Age3","r.Age4","r.Age5","r.Age6","n.Age0","n.Age1","n.Age2","n.Age3","n.Age4","n.Age5","n.Age6","P.Age0","P.Age1","P.Age2","P.Age3","P.Age4","P.Age5","P.Age6"),class = "data.frame")

我很抱歉没有删除列 R 不喜欢我删除其他列时。

我正在尝试使用 grep 根据行名称的第一个字符将第 1 个 2 个向量(行名称和第 1 列)分解为所需的列。

test  <- cut(test[,0],breaks = c(grep("r"),grep("n"),grep("P")),labels = c("r","n","P"),right = FALSE)

所以基本上我的 df 看起来像这样,带有四舍五入的值(另一件事我显然不知道如何处理 dput)。这将使用行名的第一个字母作为新列名。

         r   n     P
Age0  1.00  11    NA
Age1 -2.42  10  0.50
Age2 -0.07   9  0.86
Age3  0.75   8  0.05
Age4 -0.27   7  0.55
Age5 -0.85   6  0.03
Age6 -0.33   5  0.59

我找不到一篇关于在 r 中按行名剪切或破坏的帖子。

我相信这里的一些聪明人可以直接从最初的列表中以更简洁的方式完成这项工作,但那个人显然不是我。

再次为冗长的数据和位数表示歉意。谢谢。

解决方法

无需使用 testdata.frame 数据转换为单个 do.call,可以通过以下方式获得所需的输出:

as.data.frame(lapply(test,function(x) x[1,]))
#                r  n          P
# Age0  1.00000000 11         NA
# Age1 -0.24217553 10 0.50023280
# Age2 -0.06665832  9 0.86470660
# Age3  0.74789846  7 0.05321939
# Age4 -0.27312732  7 0.55342412
# Age5 -0.85417468  6 0.03034705
# Age6 -0.32647240  5 0.59182934
,

在 data.frame 上使用 tidyverse:

library(dplyr)
library(tidyr)
test %>%
  add_rownames(var = "rowname") %>%
  separate(rowname,c("Var","Age")) %>%
  select(Var,Age,Age0) %>%
  pivot_wider(names_from = Var,values_from = Age0)