r - 自动合并列,合并值在容器中用分隔符分隔

标签 r dataframe data-cleaning data-wrangling

我有一个大数据框,其中很多列的列名都包含 .。这是我在下面示例中的方法:

#this somewhat resembles what we have in hand
df <- data.frame(id= c("HD1", "HD2", "HD3", "HD4"),
                 mon.1= c(1, 0, 1, 4),
                 mon.2= c("a", "b", "c", "d"),
                 mon.2.4.1...1= c("#ji", "#ki", NA, "#ui"),
                 tue.6= c("1", "2", "3", "4"),
                 tue= c(190, 2345, 41, 89),
                 heh= c("1mn", "2a", "g78", "asd324"),
                 wed= c(1890, 9002, 14341, 657),
                 wed.01= c(NA, "@ksdf", NA, NA),
                 thu.0234= c("@jksdff", "@sfd", "@kukg.676", "@jdkfjk"),
                 rating= c(1,2,3,4))

#in order to collapse the columns, we can apply a mapply variant

#here i attach a new column to original df named combined1 which collapses all mon.....
df<- within(df, 
       combined1 <- Map(list, as.character(mon.1),
                        as.character(mon.2),
                        as.character(mon.2.4.1...1)))

#process repeats for others
df <- within(df,
         combined2 <- Map(list, as.character(tue.6),
                        as.character(tue)))

df <- within(df,
        combined3 <- Map(list, as.character(wed),
                        as.character(wed.01)))

产生逗号分隔列 Combined1, Combined2,Combined3 :

# A tibble: 4 x 14
  id    mon.1 mon.2 mon.2.4.1...1 tue.6   tue heh     wed wed.01 thu.0234 rating
  <fct> <dbl> <fct> <fct>         <fct> <dbl> <fct> <dbl> <fct>  <fct>     <dbl>
1 HD1       1 a     #ji           1       190 1mn    1890 NA     @jksdff       1
2 HD2       0 b     #ki           2      2345 2a     9002 @ksdf  @sfd          2
3 HD3       1 c     NA            3        41 g78   14341 NA     @kukg.6~      3
4 HD4       4 d     #ui           4        89 asd3~   657 NA     @jdkfjk       4
# ... with 3 more variables: combined1 <named list>, combined2 <named list>,
#   combined3 <named list>

我的问题是 montuewed 大约有 20-30 列,我在创建方法时遇到问题它将读取所有内容,例如 wedwed1.43654wed.46 等等。这样我就不必手动输入它们了。非常感谢您的帮助!

编辑 像这样的东西

> df[,11:14]
  rating combined1 combined2   combined3
1      1 1, a, #ji    1, 190    1890, NA
2      2 0, b, #ki   2, 2345 9002, @ksdf
3      3  1, c, NA     3, 41   14341, NA
4      4 4, d, #ui     4, 89     657, NA

最佳答案

这是一个选项,我们删除以 . ('nm1') 开头的列名的后缀部分,创建一个频率 table,提取那些具有更多超过一个计数('nm2'),遍历这些唯一名称,使用 grep 从数据集中提取列,并将其分配给创建“组合”列

nm1 <- sub("\\..*", "", names(df))
nm2 <- names(which(table(nm1) > 1))
df[paste0('combined', seq_along(nm2))] <- lapply(nm2, 
        function(x) df[grep(x, names(df))])



df$combined1
#  mon.1 mon.2 mon.2.4.1...1
#1     1     a           #ji
#2     0     b           #ki
#3     1     c          <NA>
#4     4     d           #ui

如果我们希望这是一个 list

df[paste0('combined', seq_along(nm2))] <- lapply(nm2, 
        function(x) 
        apply(df[grep(x, names(df))], 1, function(x) as.list(c(x))))


df
#   id mon.1 mon.2 mon.2.4.1...1 tue.6  tue    heh   wed wed.01  thu.0234 rating combined1 combined2    combined3
#1 HD1     1     a           #ji     1  190    1mn  1890   <NA>   @jksdff      1 1, a, #ji   1,  190     1890, NA
#2 HD2     0     b           #ki     2 2345     2a  9002  @ksdf      @sfd      2 0, b, #ki   2, 2345  9002, @ksdf
#3 HD3     1     c          <NA>     3   41    g78 14341   <NA> @kukg.676      3  1, c, NA   3,   41    14341, NA
#4 HD4     4     d           #ui     4   89 asd324   657   <NA>   @jdkfjk      4 4, d, #ui   4,   89      657, NA

关于r - 自动合并列,合并值在容器中用分隔符分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61783872/

相关文章:

r - 如何翻译data.table代码崩溃

python - 如何在驱动器中的每个文件夹上运行脚本?

python - 有没有一种简单的方法可以在Python中绘制和操作持续时间(小时/分钟/秒)数据?不是日期时间数据

xml - 使用 R 将新数据附加到格式化的 xlsx 工作表

python - R中基于逻辑关系的数据分割

r - 使用基本数据集在 R 和 ggplot 中显示轮廓时出现问题

python - R 相当于 python numpy slice : [:, 无,:]

r - 如何以简单的方式处理多个 if 条件?

python - 将 SpaCy 的 EntityRecognizer 应用于 Pandas 数据框中的列

Python3.7 Pandas1.0.1 Dataframe - 计算范围内的列总和并重新组合为一个新行?