在R中使用行聚合创建新数据

时间:2017-09-22 19:51:25

标签: r

我的数据框包含两个列:ID和类型(字符)。见下文:

set.seed(123)
ID <- seq(1,25)
type <- sample(letters[1:26], 25, replace=TRUE)

df <- data.frame(ID, type)

我需要创建一个只包含一列的新数据框。第一次观察将是第一次 列类型中有三个字母,第二个观察是第二个三个字母,很快就会出现。

新数据看起来像

ndf <- data.frame(ntype=c("huk", "wyb", "nxo", "lyl", "roc", "xgb", "iyx", "sqz", "r"))

3 个答案:

答案 0 :(得分:4)

输入向量

1) rollapply

library(zoo)

rollapply(df$type, 3, by = 3, paste, collapse = "", partial = TRUE, align = "left")

,并提供:

[1] "huk" "wyb" "nxo" "lyl" "roc" "xgb" "iyx" "sqz" "r" 

2)此替代方案使用aggregate且没有包。

n <- nrow(df)
aggregate(type ~  gl(n, 3, n), df, paste, collapse = "")[2]

,并提供:

  type
1  huk
2  wyb
3  nxo
4  lyl
5  roc
6  xgb
7  iyx
8  sqz
9    r

答案 1 :(得分:3)

我们使用gl创建一个分组变量,然后将tapplypaste元素组合在一起

n <- 3 
ndf <- data.frame(ntype = with(df, unname(tapply(type, as.integer(gl(nrow(df), n, 
         nrow(df))), FUN =paste, collapse=""))), stringsAsFactors= FALSE)
ndf$ntype
#[1] "huk" "wyb" "nxo" "lyl" "roc" "xgb" "iyx" "sqz" "r"  

或者另一种选择是paste将整个列放在一起然后拆分

strsplit(paste(df$type, collapse=""), "(?<=.{3})", perl = TRUE)[[1]]
#[1] "huk" "wyb" "nxo" "lyl" "roc" "xgb" "iyx" "sqz" "r"  

或另一个选项substring paste

substring(paste(df$type, collapse=""), seq(1, nrow(df), by = 3),
        c(seq(3, nrow(df), by = 3), nrow(df)))
#[1] "huk" "wyb" "nxo" "lyl" "roc" "xgb" "iyx" "sqz" "r"  

注意:以上都是base R解决方案

答案 2 :(得分:0)

使用jq '.[] | walk(.key = true)'

dplyr