对数据框列表执行相同的功能,并将其保存在具有新名称的新数据框中

时间:2018-08-23 09:57:39

标签: r

我有数据帧A,B,C,并希望根据数据帧D以相同的方式修改每个数据帧。就像:

A = data.frame(x=c('a','b','c','d','e','f'),type=c('1','2','3','2','1','3'))
B = data.frame(x=c('g','h','i') ,type=c('1','2','3'))
C = data.frame(x=c('j','k','l','m'),type=c('2','3','1','2') )
D = data.frame(type=c('1','2','3','4'),newtype=c('I','II','III','IV') )

首先,我想将A,B,C中的类型更改为D中的新类型。 对于A,我可以这样做:

A$type <- D$newtype[match(A$type, D$type)]

现在如何在B和C上执行相同的功能?我查看了其他问题,并认为应该使用lapply来实现,但我无法正确编写。

2 个答案:

答案 0 :(得分:1)

我会将ABC存储在list中,然后将data.frame的{​​{1}}条目与{{1} }。

使用Dtype

purrr::map

在基数R中使用dplyr::left_joinlibrary(purrr) library(dplyr) map(list(A, B, C), ~left_join(.x, D)) #[[1]] # x type newtype #1 a 1 I #2 b 2 II #3 c 3 III #4 d 2 II #5 e 1 I #6 f 3 III # #[[2]] # x type newtype #1 g 1 I #2 h 2 II #3 i 3 III # #[[3]] # x type newtype #1 j 2 II #2 k 3 III #3 l 1 I #4 m 2 II

Map

答案 1 :(得分:1)

“从字面上看”我认为应该是这样的:

A = data.frame(x=c('a','b','c','d','e','f'),type=c('1','2','3','2','1','3'))
B = data.frame(x=c('g','h','i') ,type=c('1','2','3'))
C = data.frame(x=c('j','k','l','m'),type=c('2','3','1','2') )
D = data.frame(type=c('1','2','3','4'),newtype=c('I','II','III','IV') )

list2env(
  lapply(list(A = A, B = B, C = C), function(x) {
    x$type <- D$newtype[match(x$type, D$type)]
    x
  }),
  envir = parent.frame())

# A
# x type
#1 a    I
#2 b   II
#3 c  III
#4 d   II
#5 e    I
#6 f  III