使用lapply从数据帧列表中创建新的数据帧

时间:2019-04-08 10:14:26

标签: r list dataframe lapply

我有一个数据帧列表。每个列表包含两列“名称”和“代码”

A

Name Code
AAA  123
BBB  456
CCC  789

B

   Name Code
   AAA  123
   AAB  124
   AAC  125

C

Name Code
BBB  456
BBA  457
BBC  458
  1. 我想创建一个包含所有唯一名称和代码的新数据框“ NEW”,以便获得

    名称代码 AAA 123 AAB 124 瑞声125 BBB 456 英国广播公司457 英国广播公司458 CCC 789

  2. 具有“ NEW”之后,我想将数据帧列表与“ NEW”进行比较,并说出每个名称是否出现在一个列表中。 我想将新列(列表中数据框的名称)添加到“ NEW”数据框,并在可能的情况下输入是或否。

所以得到这个

Name Code  A     B     C
AAA  123   YES   YES   NO
AAB  124   NO    YES   NO
AAC  125   NO    YES   NO
BBB  456   YES   NO    YES
BBA  457   No    NO    YES
BBC  458   NO    NO    YES
CCC  789   YES   NO    NO

我想使用lapply,但不确定如何做。

你能帮我吗

2 个答案:

答案 0 :(得分:1)

绑定具有ID的行,然后使用 data.table 从长到宽整形:

# example data
myList <- list(A = data.frame(x = 1:3),
               B = data.frame(x = 2:4),
               C = data.frame(x = 4:6))

library(data.table)

dcast(rbindlist(myList, idcol = "ID"), x ~ ID)
#    x  A  B  C
# 1: 1  1 NA NA
# 2: 2  2  2 NA
# 3: 3  3  3 NA
# 4: 4 NA  4  4
# 5: 5 NA NA  5
# 6: 6 NA NA  6

答案 1 :(得分:0)

使用基数R,我们可以创建数据帧列表,并使用merge将它们Reduce一起使用。对于每个列表,我们检查新合并的数据帧(df_merge)中是否存在该值,并根据它们的存在/不存在来分配值“是”,“否”。

list_name <- mget(c("A", "B", "C"))

df_merge <- Reduce(function(x, y) merge(x, y, all = TRUE), list_name)
df_merge[names(list_name)] <- lapply(list_name, function(x) 
                              c("No", "Yes")[(df_merge$Name %in% x$Name + 1)])


df_merge

#  Name Code   A   B   C
#1  AAA  123 Yes Yes  No
#2  BBB  456 Yes  No Yes
#3  CCC  789 Yes  No  No
#4  AAB  124  No Yes  No
#5  AAC  125  No Yes  No
#6  BBA  457  No  No Yes
#7  BBC  458  No  No Yes