为大列表的每个元素自动在大列表中创建向量的功能
Function to automatically create vector in a large list for each element of the large list
我有一个具有以下结构的数据框:
A.Data 是一个带有数字数据的向量
A.Quartile 是一个向量,其中计算了每个 A.data 的四分位数以及属于哪个四分位数这个数据。 (Q1,Q2,Q3,Q4).
我使用了非常相似的代码来创建分位数和所属的 Q。
quantile(x <- rnorm(1001))
list2env(setNames(as.list(quantile(x <- rnorm(1001))),paste0("Q",1:5)),.GlobalEnv)
现在,(这是我的问题)我有一个导入到 R 中的 .csv,其中包含超过 400 个元素和 XYZ.Data 个向量
因此,当我将 .csv 文件导入我的环境时,我想创建一个函数来一次性创建所有 XYZ.Quartile 向量,但我不知道如何做。
重点是使用函数从 .csv 文件读取列表中加载到环境中的所有元素,并具有创建 B.Quartile、C.Quartile、[=51= 的函数], 向量...列表中的每个元素一个。
有人可以帮忙吗?
非常感谢您的评论。
PD:新代码示例
quantile(x <- Orange$circumference)
Orange<- within(Orange, Quartile <- as.integer(cut(Orange$circumference, quantile(Orange$circumference, probs=0:4/4), include.lowest=TRUE)))
您的示例数据令人困惑。目前尚不清楚您的数据结构是什么,所以我只是假装您的列表是 matrix/data.frame.
的列
# proper example data
set.seed(1)
dat <- replicate(6, rnorm(20))
colnames(dat) <- LETTERS[1:6]
head(dat)
# A B C D E F
#[1,] -0.6264538 0.91897737 -0.1645236 2.40161776 -0.5686687 -0.62036668
#[2,] 0.1836433 0.78213630 -0.2533617 -0.03924000 -0.1351786 0.04211587
#[3,] -0.8356286 0.07456498 0.6969634 0.68973936 1.1780870 -0.91092165
#[4,] 1.5952808 -1.98935170 0.5566632 0.02800216 -1.5235668 0.15802877
#[5,] 0.3295078 0.61982575 -0.6887557 -0.74327321 0.5939462 -0.65458464
#[6,] -0.8204684 -0.05612874 -0.7074952 0.18879230 0.3329504 1.76728727
# for each column i
qdat <- apply(dat, 2, function(i){
q <- quantile(i)
# for each element j in column i
sapply(i, function(j){
paste0("Q",1:5)[sum(j > q)+1]
})
})
head(qdat)
# A B C D E F
#[1,] "Q2" "Q5" "Q3" "Q5" "Q2" "Q2"
#[2,] "Q3" "Q5" "Q3" "Q3" "Q3" "Q4"
#[3,] "Q2" "Q4" "Q5" "Q5" "Q5" "Q1"
#[4,] "Q5" "Q1" "Q4" "Q3" "Q1" "Q4"
#[5,] "Q3" "Q4" "Q2" "Q2" "Q4" "Q2"
#[6,] "Q2" "Q3" "Q2" "Q4" "Q4" "Q5"
编辑 1
见以下代码:
# example data
set.seed(1)
dat <- replicate(3, rnorm(20))
colnames(dat) <- paste0(LETTERS[1:3],".Data")
replacewithQ <- function(x) {
as.integer(cut(x,
quantile(x,
probs=0:4/4),
include.lowest=TRUE)
)
}
qdat <- apply(dat, 2, replacewithQ)
colnames(qdat) <- gsub("Data","Quartile",colnames(dat))
newdat <- cbind(dat, qdat)
head(newdat)
# A.Data B.Data C.Data A.Quartile B.Quartile C.Quartile
#[1,] -0.6264538 0.91897737 -0.1645236 1 4 2
#[2,] 0.1836433 0.78213630 -0.2533617 2 4 2
#[3,] -0.8356286 0.07456498 0.6969634 1 3 4
#[4,] 1.5952808 -1.98935170 0.5566632 4 1 3
#[5,] 0.3295078 0.61982575 -0.6887557 2 3 1
#[6,] -0.8204684 -0.05612874 -0.7074952 1 2 1
我有一个具有以下结构的数据框:
A.Data 是一个带有数字数据的向量
A.Quartile 是一个向量,其中计算了每个 A.data 的四分位数以及属于哪个四分位数这个数据。 (Q1,Q2,Q3,Q4).
我使用了非常相似的代码来创建分位数和所属的 Q。
quantile(x <- rnorm(1001))
list2env(setNames(as.list(quantile(x <- rnorm(1001))),paste0("Q",1:5)),.GlobalEnv)
现在,(这是我的问题)我有一个导入到 R 中的 .csv,其中包含超过 400 个元素和 XYZ.Data 个向量
因此,当我将 .csv 文件导入我的环境时,我想创建一个函数来一次性创建所有 XYZ.Quartile 向量,但我不知道如何做。
重点是使用函数从 .csv 文件读取列表中加载到环境中的所有元素,并具有创建 B.Quartile、C.Quartile、[=51= 的函数], 向量...列表中的每个元素一个。
有人可以帮忙吗?
非常感谢您的评论。
PD:新代码示例
quantile(x <- Orange$circumference)
Orange<- within(Orange, Quartile <- as.integer(cut(Orange$circumference, quantile(Orange$circumference, probs=0:4/4), include.lowest=TRUE)))
您的示例数据令人困惑。目前尚不清楚您的数据结构是什么,所以我只是假装您的列表是 matrix/data.frame.
的列# proper example data
set.seed(1)
dat <- replicate(6, rnorm(20))
colnames(dat) <- LETTERS[1:6]
head(dat)
# A B C D E F
#[1,] -0.6264538 0.91897737 -0.1645236 2.40161776 -0.5686687 -0.62036668
#[2,] 0.1836433 0.78213630 -0.2533617 -0.03924000 -0.1351786 0.04211587
#[3,] -0.8356286 0.07456498 0.6969634 0.68973936 1.1780870 -0.91092165
#[4,] 1.5952808 -1.98935170 0.5566632 0.02800216 -1.5235668 0.15802877
#[5,] 0.3295078 0.61982575 -0.6887557 -0.74327321 0.5939462 -0.65458464
#[6,] -0.8204684 -0.05612874 -0.7074952 0.18879230 0.3329504 1.76728727
# for each column i
qdat <- apply(dat, 2, function(i){
q <- quantile(i)
# for each element j in column i
sapply(i, function(j){
paste0("Q",1:5)[sum(j > q)+1]
})
})
head(qdat)
# A B C D E F
#[1,] "Q2" "Q5" "Q3" "Q5" "Q2" "Q2"
#[2,] "Q3" "Q5" "Q3" "Q3" "Q3" "Q4"
#[3,] "Q2" "Q4" "Q5" "Q5" "Q5" "Q1"
#[4,] "Q5" "Q1" "Q4" "Q3" "Q1" "Q4"
#[5,] "Q3" "Q4" "Q2" "Q2" "Q4" "Q2"
#[6,] "Q2" "Q3" "Q2" "Q4" "Q4" "Q5"
编辑 1 见以下代码:
# example data
set.seed(1)
dat <- replicate(3, rnorm(20))
colnames(dat) <- paste0(LETTERS[1:3],".Data")
replacewithQ <- function(x) {
as.integer(cut(x,
quantile(x,
probs=0:4/4),
include.lowest=TRUE)
)
}
qdat <- apply(dat, 2, replacewithQ)
colnames(qdat) <- gsub("Data","Quartile",colnames(dat))
newdat <- cbind(dat, qdat)
head(newdat)
# A.Data B.Data C.Data A.Quartile B.Quartile C.Quartile
#[1,] -0.6264538 0.91897737 -0.1645236 1 4 2
#[2,] 0.1836433 0.78213630 -0.2533617 2 4 2
#[3,] -0.8356286 0.07456498 0.6969634 1 3 4
#[4,] 1.5952808 -1.98935170 0.5566632 4 1 3
#[5,] 0.3295078 0.61982575 -0.6887557 2 3 1
#[6,] -0.8204684 -0.05612874 -0.7074952 1 2 1