我是新来的,但可以使用一些帮助。我有一个数据帧列表,对于列表中的每个元素(即data.frame),我想将数据集中的一列快速粘贴到同一数据集中的其他多个列中,仅用句点(“ 。”)。
因此,如果我在数据帧列表中有一组数据:
list1[[1]]
A B C
2 1 5
4 2 2
然后我想要以下结果:
list1[[1]]
A B C
2.5 1.5 5
4.2 2.2 2
将C分别粘贴到A和B的位置。然后,我希望对列表中的每个数据框执行此操作。
我尝试了以下方法:
pasteX<-function(df) {for (i in 1:dim(df)[2]-1) {
df[,i]<-as.numeric(sprintf("%s.%s", df[,i], df$C))
}
return(df)}
list2<-lapply(list1, pasteX)
但是对于较大的矩阵和列表,此方法的速度很慢。有什么建议可以使此代码更快?谢谢!
答案 0 :(得分:4)
假设一切都是整数<10
lapply(list1, function(x){
x[,-3] <- x[,-3] + x[,3]/10
x})
答案 1 :(得分:3)
我们可以使用Map
list1[[1]][-3] <- Map(function(x, y) as.numeric(sprintf('%s.%s', x, y)),
list1[[1]][-3], list1[[1]][3])
如果有很多数据集,请使用lapply
循环,将前两列转换为matrix
,并粘贴第三列,更新输出,然后返回数据集
lapply(list1, function(x) {
x[1:2] <- as.numeric(sprintf('%s.%s', as.matrix(x[1:2]), x[,3]));
x })
#[[1]]
# A B C
#1 2.5 1.5 5
#2 4.2 2.2 2
或使用tidyverse
library(tidyverse)
map(list1, ~ .x %>%
mutate_at(1:2, funs(as.numeric(sprintf('%s.%s', ., C)))))
或与data.table
library(data.table)
lapply(list1, function(x) setDT(x)[, (1:2) :=
lapply(.SD, function(x) as.numeric(sprintf('%s.%s', x, C))) ,
.SDcols = 1:2][])
答案 2 :(得分:0)
尝试一下:
df <- data.frame(a = c(1,2,3), b = c(3,2,1), c = c(2,1,1))
pastex <- function(x){
m<- sapply(df[,1:2], function(x) as.numeric(paste(x, df$c, sep = '.')))
m <- as.data.frame(m)
m <- cbind(m, df["c"])
return(m)
}
mylist <- list(df1 = df, df2 = df)
lapply(mylist, pastex)