我的数据框包含两个列: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"))
答案 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
创建一个分组变量,然后将tapply
,paste
元素组合在一起
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