将R中的一列数据帧转换为多列
目前,我的数据框由1列2326行组成。我想将数据帧转换为由11行组成。更具体地说,我当前的数据帧将R中的一列数据帧转换为多列,r,dataframe,transform,reshape,transpose,R,Dataframe,Transform,Reshape,Transpose,目前,我的数据框由1列2326行组成。我想将数据帧转换为由11行组成。更具体地说,我当前的数据帧 John Doe 7 45 42 978 3 6 8 9 0 11 Sally Jenkins 2 等等 我希望我的数据框看起来像: John Doe 7 45 42 978 3 6 8 9 0 11 Sally Jenkins 2 每个人都是一行,然后他们的统计数据都是该行中单独的一列。有些人缺少一个统计数据,因此我无法根据每个人姓名之间的行数进行区分
John Doe
7
45
42
978
3
6
8
9
0
11
Sally Jenkins
2
等等
我希望我的数据框看起来像:
John Doe 7 45 42 978 3 6 8 9 0 11
Sally Jenkins 2
每个人都是一行,然后他们的统计数据都是该行中单独的一列。有些人缺少一个统计数据,因此我无法根据每个人姓名之间的行数进行区分
我尝试过使用t()
以及重塑(transform())
。你对下一步去哪里有什么建议吗 1)一个选项是基于字母表的存在创建一个分组变量,通过创建列表
输出来汇总
,并使用最宽
将该列表
更改为一组新列
library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
group_by(grp = cumsum(str_detect(col1, "[A-Za-z]"))) %>%
group_by(coln = first(col1), .add = TRUE) %>%
slice(-1) %>%
summarise(out = list(as.list(as.numeric(col1)))) %>%
unnest_wider(c(out)) %>%
ungroup %>%
select(-grp) %>%
rename_at(-1, ~ str_c('new_col', seq_along(.)))
# A tibble: 2 x 11
# coln new_col1 new_col2 new_col3 new_col4 new_col5 new_col6 new_col7 new_col8 new_col9 new_col10
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 John Doe 7 45 42 978 3 6 8 9 0 11
#2 Sally Jenkins 2 NA NA NA NA NA NA NA NA NA
数据
df1使用末尾注释中重复定义的DF
,确保DF[[1]]]
为字符。然后使用grep
创建一个逻辑变量g
,每个输入行有一个元素,对于每个标题为TRUE,否则为FALSE。然后删除标题并使用setNames
将其拆分,以设置结果列表的名称。最后,将每个列表组件转换为一个数值ts
序列,因为这样的序列即使长度不同也可以标记。现在cbind
。没有使用任何软件包
DF[[1]] <- as.character(DF[[1]])
g <- grepl("\\D", DF[[1]])
s <- setNames(split(DF[[1]][!g], cumsum(g)[!g]), DF[[1]][g])
t(do.call("cbind", lapply(s, function(x) ts(as.numeric(x)))))
注
可复制形式的输入假定为:
Lines <- "John Doe
7
45
42
978
3
6
8
9
0
11
Sally Jenkins
2"
DF <- read.table(text = Lines, as.is = TRUE, sep = ";")
行您到底尝试了什么?这些行应该对应什么?比如,如果一个人缺少一个统计数据,你怎么知道是哪一个?
DF[[1]] <- as.character(DF[[1]])
g <- grepl("\\D", DF[[1]])
s <- setNames(split(DF[[1]][!g], cumsum(g)[!g]), DF[[1]][g])
t(do.call("cbind", lapply(s, function(x) ts(as.numeric(x)))))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
John Doe 7 45 42 978 3 6 8 9 0 11
Sally Jenkins 2 NA NA NA NA NA NA NA NA NA
Lines <- "John Doe
7
45
42
978
3
6
8
9
0
11
Sally Jenkins
2"
DF <- read.table(text = Lines, as.is = TRUE, sep = ";")