加速R for循环以将多个变量粘贴在一起
我是新来的,但需要一些帮助。我有一个数据帧列表,对于列表中的每个元素(即data.frame),我想快速地将数据集中的一列粘贴到同一数据集中的多个其他列,仅以句点(“.”)分隔 因此,如果我在数据帧列表中有一组数据:加速R for循环以将多个变量粘贴在一起,r,R,我是新来的,但需要一些帮助。我有一个数据帧列表,对于列表中的每个元素(即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。然后,我希望对列表中的每个数据帧执行此操作 我尝试了以下方法
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)
pasteX我们可以使用Map
list1[[1]][-3] <- Map(function(x, y) as.numeric(sprintf('%s.%s', x, y)),
list1[[1]][-3], list1[[1]][3])
或者使用tidyverse
library(tidyverse)
map(list1, ~ .x %>%
mutate_at(1:2, funs(as.numeric(sprintf('%s.%s', ., C)))))
或使用数据。表格
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][])
假设所有的值都是小于10的整数
lapply(list1, function(x){
x[,-3] <- x[,-3] + x[,3]/10
x})
lappy(列表1,函数(x){
x[,-3]试试这个:
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)
df欢迎。理想情况下,以一种更易于阅读的方式提供您的数据:啊,感谢您分享……从现在起,我将更加关注如何展示我的数据和问题!谢谢,@akrun!这很有用,我现在将试着实现它,看看它给我带来了多大的提升。@zeekster26没问题。如果您正在检查基准测试,我会还更新了data.table方法。请检查alsoSweet!非常感谢…我尝试了data.table方法,但操作有点错误。地图解决方案是迄今为止最快的!
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)