【问题标题】:R: Creating data frame from list of values and list of variable namesR:从值列表和变量名称列表创建数据框
【发布时间】:2020-09-29 08:25:29
【问题描述】:

我有两个列表,A 和 B:

  • 列表 A 包含 K 个长度为 W 的字符向量。每个向量包含相同的 W 个字符串值,但字符串的索引可能不同。在实践中,我们可以将此列表视为包含变量名称的向量,其中每个向量包含相同的变量名称但顺序可能不同..

  • 列表 B 包含 K 个长度为 W 的字符向量。每个向量可以包含 W 个任意值。在实践中,我们可以认为这个列表包含向量,列表A的每个向量中包含的变量的对应值。

我正在尝试生成一个长 K 行、宽 W 行的数据框,其中列名是列表 A 中每个向量中的 W 唯一值,并且每行的值都是从其中找到的向量中提取的列表 B 中的行索引。

我已经能够做到这一点(下面是最小的工作示例),但它看起来非常h​​ackish,因为它基本上涉及将两个列表转换为数据框,然后在循环中将其中一个列表的值作为列名分配给另一个。

有没有办法在使用循环组合它们之前跳过将每个列表转换为数据框的步骤?循环遍历列表似乎效率低下,生成两个数据帧而不是一个利用两个列表内容的单个数据帧也是如此。

# Declare number of rows and columns
K <- 10
W <- 5
colnames_set <- sample(LETTERS, W)

# Generate example data

# List A: column names
list_a <- vector(mode = "list", length = K)
list_a <- lapply(list_a, function(x) x <- sample(colnames_set, W))

# List B: values
list_b <- vector(mode = "list", length = K)
list_b <- lapply(list_b, function(x) x <- rnorm(n = W))

# Define function to take a vector and turn it into a 
# data frame where each element of the vector is 
# assigned to its own colun
vec2df <- function(x) {
  x %>%
    as.data.frame(., stringsAsFactors = FALSE) %>%
    t() %>% 
    as.data.frame(., stringsAsFactors = FALSE)
}

# Convert vectors to data frames
vars <- lapply(list_a, vec2df)
vals <- lapply(list_b, vec2df)

# Combine the data frames into one
# (note the looping)
for(i in 1:K){
  colnames(vals[[i]]) <- vars[[i]][1, ]
}

# Combine rows into a single data frame
out <- vals %>% 
       dplyr::bind_rows()

rownames(out) <- NULL

# Show output
out

【问题讨论】:

    标签: r list loops dataframe vectorization


    【解决方案1】:

    排列list_b中的数据,使变量对齐。我们可以使用Map/mapply 来执行此操作,将输出转换为数据框并命名列。

    setNames(data.frame(t(mapply(function(x, y) y[order(x)], list_a, list_b))), 
                         sort(colnames_set))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多