【问题标题】:Extracting and cbinding similarly named variables in a data.frame in R在R中的data.frame中提取和绑定类似命名的变量
【发布时间】:2019-10-05 20:03:34
【问题描述】:

我有一个 cbind 中的 2 个 data.frames,称为 DATA。使用 BASE R,我想知道如何提取 cbind 中类似命名的变量 DATA 并将它们存储为列表?

对于下面的示例,我希望所有变量 AAs 和 DATA 中的所有变量 BBs 都单独 cbinded 并存储为列表?

注意:名称可以是任何东西,变量的数量可以是任何数字。高度赞赏函数(al)解决方案。

注意:假设我们无法访问r,唯一的输入是DATA

r <- list(
 data.frame(Name = rep("Jacob", 6), 
           X = c(2,2,1,1,NA, NA), 
           Y = c(1,1,1,2,1,NA), 
           Z = rep(3, 6), 
         out = rep(1, 6)), 

 data.frame(Name = rep("Jon", 6), 
           X = c(1,NA,3,1,NA,NA), 
           Y = c(1,1,1,2,NA,NA), 
           Z = rep(2, 6), 
         out = rep(1, 6)), 

 data.frame(Name = rep("Jon", 6), 
            X = c(1,NA,3,1,NA,NA), 
            Y = c(1,1,1,2,2,NA), 
            Z = rep(2, 6), 
          out = rep(2, 6)), 

 data.frame(Name = rep("Jim", 6), 
            X = c(1,NA,3,1,NA,NA), 
            Y = c(1,1,1,2,2,NA), 
            Z = rep(2, 6), 
          out = rep(1, 6)))

DATA <- do.call(cbind, r)  ## DATA: cbind of two data.frames

【问题讨论】:

  • @RonakShah,问题是如何捕获 DATA 中的常见 colnames。 Arun,建议使用:tbl &lt;- table(names(DATA)); nm1 &lt;- names(which(tbl==max(tbl)))。但是这个策略会失败,例如如果 DATA 是这样的:r &lt;- list( data.frame( AA = c(2,2,1,1,3,2), BB = c(1,1,1,2,2,NA), CC = 1:6), data.frame( AA = c(1,NA,3,1,3,2), BB = c(1,1,1,2,2,2)), data.frame( CC = c(1,NA,3,1,3,2), AA = c(1,1,1,2,2,2), BB = 0:5) ); DATA &lt;- do.call(cbind, r)
  • @akrun, Arun, my question there 与您的答案有关。假设我们想在下面的lapply 调用之后压缩不变的变量。我们怎么能在这里做到这一点?
  • @Reza 不是你想要的答案
  • @Reza 我更新了帖子。可能是我的想法不同
  • @Reza 如果您需要更多说明,请提出另一个问题

标签: r list function loops dataframe


【解决方案1】:

这是split 的选项。不建议在数据集中使用相同的重复列名。但是,如果确实需要,在split 之后,通过删除. 来更改列名,并在其末尾添加一个或多个数字,并加上sub

nm1 <- Reduce(intersect, lapply(r, colnames)) # get the common names
lst1 <- split.default(DATA[names(DATA) %in% nm1], names(DATA)[names(DATA) %in% nm1])
lapply(lst1, function(x) setNames(x, sub("\\.\\d+$", "", names(x))))

或者,如果我们只需要使用 'DATA' 而不是 'r' 来查找 intersecting 列名。这很困难,但我们可以得到列名出现的频率并选择频率为 2 的列名

tbl <- table(names(DATA))
nm1 <- names(which(tbl==max(tbl)))

像以前一样在split.default 中使用它

lst1 <- split.default(DATA[names(DATA) %in% nm1], names(DATA)[names(DATA) %in% nm1])
lapply(lst1, function(x) setNames(x, sub("\\.\\d+$", "", names(x))))

使用 OP 的新例子

r <- list( data.frame( AA = c(2,2,1,1,3,2), BB = c(1,1,1,2,2,NA), CC = 1:6), data.frame( AA = c(1,NA,3,1,3,2), BB = c(1,1,1,2,2,2)), data.frame( AA = c(1,NA,3,1,3,2), BB = c(1,1,1,2,2,2), DD = 0:5) )
DATA <- do.call(cbind, r)

tbl <- table(names(DATA))
nm1 <- names(which(tbl==max(tbl)))
lst1 <- split.default(DATA[names(DATA) %in% nm1], names(DATA)[names(DATA) %in% nm1])
lapply(lst1, function(x) setNames(x, sub("\\.\\d+$", "", names(x))))
#$AA
#  AA AA AA
#1  2  1  1
#2  2 NA NA
#3  1  3  3
#4  1  1  1
#5  3  3  3
#6  2  2  2

#$BB
#  BB BB BB
#1  1  1  1
#2  1  1  1
#3  1  1  1
#4  2  2  2
#5  2  2  2
#6 NA  2  2

【讨论】:

  • 评论不用于扩展讨论;这个对话是moved to chat
  • Arun,my question there 与您的回答有关。假设我们想压缩在上面的lapply 调用之后不变的变量。我们怎么能在这里做到这一点?
猜你喜欢
  • 2012-03-16
  • 2016-08-23
  • 2020-05-14
  • 2018-10-07
  • 2015-03-04
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多