【问题标题】:Map a list of dataframe columns into another dataframe r将数据框列列表映射到另一个数据框 r
【发布时间】:2021-03-23 13:39:00
【问题描述】:

下面给出了数据框的示例列表。 listofDataFrames 包含多个数据帧。每个数据框都包含一列lev,这是映射过程中使用的键。这些值是除lev 之外的列。应根据来自listofDataFrames 的映射为DF 生成新列。更清楚地说,如果我们从listofDataFrames 中考虑colors,则有两列:“colors number 3”和“colors number 10”。这些列都包含 3 个唯一值:“r”、“l”和“?”。在DF 中,我们应该创建两个新列:“colors number 3”和“colors number 10”。我们可以基于colors from listofDataFrames. In DF` 中的lev 列创建它们,如果对于特定的行和列“颜色”具有“橙色”,那么我们应该为新列“颜色编号 3”映射“r” ”。下面给出了预期的输出。

# Create an example list of dataframes and populate it
listofDataFrames <- list() 

genres <- data.frame("genres number 12" =  c("r","l","?","r","r"),
           "genres number 17" =  c("l","r","?","l","?"),
           lev = c("pop","rock","jazz","blues","r&b"),
           check.names = FALSE)

colors <- data.frame("colors number 3" =  c("l","r","?","r"),
                     "colors number 10" =  c("l","r","l","r"),
                     lev = c("red","blue","green","orange"),
                     check.names = FALSE)

listofDataFrames[["genres"]] <- genres
listofDataFrames[["colors"]] <- colors

## DF

DF <-data.frame("genres" = c("pop", "pop","jazz","rock","jazz","blues","rock","pop","blues","pop"),
           "colors" = c("orange","red","red","orange","green","blue","orange","red","blue","green"),
           "values" = c(12, 15, 24, 33 ,47, 2 , 9 ,6, 89, 75))


## EXPECTED OUTPUT

expectedOutput <- 
  data.frame("genres" = c("pop", "pop","jazz","rock","jazz","blues","rock","pop","blues","pop"),
           "colors" = c("orange","red","red","orange","green","blue","orange","red","blue","green"),
           "values" = c(12, 15, 24, 33 ,47, 2 , 9 ,6, 89, 75),
           "genres number 12" = c("r","r","?","l","?","r","l","r","r","r"),
           "genres number 17" = c("l","l","?","r","?","l","r","l","l","l"),
           "colors number 3" = c("r","l","l","r","?","r","r","l","r","?"),
           "colors number 10" = c("r","l","l","r","l","r","r","l","r","l"),
           check.names = FALSE
           )

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    在这里,我们可以先在 'genres' 上使用双 merge,然后在 'DF' 的 'colors' 列上使用对应的 list 元素

    merge(merge(DF, listofDataFrames[['genres']], all.x = TRUE, 
       by.x = 'genres', by.y = 'lev'), 
         listofDataFrames[['colors']], all.x = TRUE, by.x = 'colors', by.y = 'lev')
    

    或者我们可以使用循环

    nm1 <- names(listofDataFrames)
    out <- DF
    for(i in seq_along(nm1)) {
         out <- merge(out, listofDataFrames[[nm1[i]]], all.x = TRUE,
           by.x = nm1[i], by.y = 'lev')
    }
    

    【讨论】:

    • 如果listofDataFrames中有未知数量的数据帧,是否可以在不指定数据帧名称(颜色和流派)的情况下编写它?也许在我们合并每个数据框名称的循环中?
    • @moli 在这种情况下,我们可以使用循环来执行此操作。假设list 元素的名称与您要从“DF”合并的列相同
    • @moli lev 是我们保持不变的通用名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2020-08-29
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多