【问题标题】:Function to automatically create vector in a large list for each element of the large list函数在大小列表的每个元素中自动创建矢量
【发布时间】:2019-02-27 05:41:17
【问题描述】:

我有一个具有以下结构的数据框:

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、D.Quartile、向量的函数...一个用于列表中的每个元素。

有人可以帮忙吗?

非常感谢您的任何评论。

PD:新代码示例

quantile(x <- Orange$circumference)
Orange<- within(Orange, Quartile <- as.integer(cut(Orange$circumference, quantile(Orange$circumference, probs=0:4/4), include.lowest=TRUE)))

【问题讨论】:

  • Albert,你能提供一个minimal, reproducible example(没有你的数据图片!)和预期的输出吗?
  • 嗨 Markus,我已经编辑了问题并添加了计算四分位数和 Qs 的代码,对于如何将其转换为函数的任何帮助:1-阅读我的环境以识别每个从 .csv 导入的元素,2-计算每个元素的分位数并将其分配给其对应的 Q(1,2,3,4)?谢谢!

标签: r function quantile


【解决方案1】:

您的示例数据令人困惑。目前尚不清楚您的数据结构是什么,所以我只是假装您的列表是矩阵/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

【讨论】:

  • 嗨,埃文,感谢您的回复。我已经使用内置示例在原始问题(底部)中添加了新代码,您可以运行代码并获取我想在列表的所有元素中分布的列。该列表来自导入到 R 中的 .csv 并且它在我的环境中,所以我认为困难在于将其转换为读取列表的所有元素名称并创建新列的函数,称为 element1.Quartile , element2.quartile, element3,quartile, etc, etc, etc, etc, etc in the same way that in the Orange sample.感谢您的帮助,并对我令人困惑的示例感到抱歉。 ;-)
  • 目前还不清楚 - 你是新的例子只是告诉我你希望输出是整数而不是我上面发布的字符串。您的“列表”是像 list(A = rnorm(3), B = rnorm(6), C = rnorm(4)) 还是像 data.frame(A = rnorm(4), B = rnorm(4), C = rnorm(4)) 这样的列表?你能在你的环境中为str(your_csv_list_object) 提供输出吗?或者制作一个实际继承的示例列表,而不是使用橙色中的单个列并将其称为您的列表?除非您的数据实际上是 1 个单一的数据向量,否则这不会给您有用的响应。
  • $ Element1:2018-01-02/2018-09-21 上的“xts”对象,包含:数据:num [1:183, 1:9] 157 159 161 161 162 ... - attr(*, "dimnames")=List of 2 ..$ : NULL ..$ : chr [1:9] "Elem1.A" "Elem1.B" "Elem1.C" "Elem1.D" .. . 按类对象索引:[日期] TZ:UTC 感谢您的耐心等待。
  • 您的编辑工作正常。我的最后一个问题是,是否可以在不创建新数据框的情况下直接在列表中创建新列?我的意思是一个读取元素名称的函数,使用 elementname.Qdata 创建一个新列并遍布当前列表?非常感谢您的回复。
  • @Albert a function() 这基本上就是我通过使用 cbind 和列重命名所做的事情?
猜你喜欢
  • 2018-10-01
  • 2014-10-17
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多