天道酬勤,学无止境

rbind complete rows every two column from single Data frame [duplicate]

i need a guidance in one of my Task : here i need to rbind [complete row] the every two columns where the total number of columns are varying[any even No of Columns] depending on the dataset Browse and uploaded by user. Similar to image i have uploaded along with the Text,Basically we can say we are stacking every two column one above other and creating a new data frame which has two column as shown in Figure , Thank you well in advance

标签

评论

We split the dataset by the character substring of the column names (remove the numbers with gsub) into a list, change the names of the list with setNames and rbind the list elements to a single data.table using rbindlist and specifying the idcol as 'Tag'

library(data.table)
lst <- split.default(df1, gsub("\\d+", "", names(df1)))
#or use
#lst <- split.default(df1, cumsum(rep(c(TRUE, FALSE), ncol(df1)/2)))

rbindlist(setNames(lst, seq_along(lst)), idcol="Tag")

data

set.seed(24)
df1 <- as.data.frame(matrix(rnorm(10*8), ncol=8,
    dimnames = list(NULL, paste0(rep(LETTERS[1:4], each = 2), 0:1))))

This is a reshape operation if you rename your columns to group appropriately:

names(df1) <- gsub("(.)(.)", "\\2.\\1", names(df1))
reshape(df1, direction="long", varying=TRUE, sep=".", timevar="Tag")

#     Tag            0           1 id
#1.A    A -0.545880758 -1.31690812  1
#2.A    A  0.536585304  0.59826911  2
#3.A    A  0.419623149 -0.76221437  3
#4.A    A -0.583627199 -1.42909030  4
#5.A    A  0.847460017  0.33224445  5
#6.A    A  0.266021979 -0.46906069  6
#7.A    A  0.444585270 -0.33498679  7
#8.A    A -0.466495124  1.53625216  8
#9.A    A -0.848370044  0.60999453  9
#10.A   A  0.002311942  0.51633570 10
#1.B    B -0.074308561 -0.03373792  1
#2.B    B -0.605156946 -0.58542756  2
# ...

Using @akrun's df1

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 将Data.frames列表重新组合为一个数据帧[重复](Recombining a list of Data.frames into a single data frame [duplicate])
    问题 这个问题已经在这里有了答案: 将数据帧列表逐行合并为一个数据帧(9个答案) 3年前关闭。 抱歉,如果您已经回答了这个问题。 另外,这是我第一次使用stackoverflow。 我有一个关于列表,数据帧和merge()和/或rbind()的初学者R问题。 我从一个看起来像这样的面板开始 COUNTRY YEAR VAR A 1 A 2 B 1 B 2 为了提高效率,我创建了一个列表,其中包含每个国家/地区的一个数据框,并对每个单独的data.frame进行了各种计算。 但是,我似乎无法将各个数据帧再次组合为一个大帧。 rbind()和merge()都告诉我仅允许元素替换。 谁能告诉我我做错了/以及如何真正重组数据帧? 谢谢 回答1 也许您想做类似的事情: do.call("rbind", my.df.list) 回答2 dplyr使您可以使用bind_rows函数: library(dplyr) foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6))) bind_rows(foo) 回答3 注意基本解决方案 do.call("rbind", my.df.list) 如果我们有许多数据帧,速度将会很慢。
  • 如何重新排列两个数据帧之间的匹配顺序(how to rearrange an order of matches between two data frames)
    问题 自昨晚以来,我一直在忙于这个问题,我不知道该怎么做。 我想要做的是将df1字符串与df2字符串匹配,并取出类似的字符串 我所做的就是这样 # a function to arrange the data to have IDs for each string normalize <- function(x, delim) { x <- gsub(")", "", x, fixed=TRUE) x <- gsub("(", "", x, fixed=TRUE) idx <- rep(seq_len(length(x)), times=nchar(gsub(sprintf("[^%s]",delim), "", as.character(x)))+1) names <- unlist(strsplit(as.character(x), delim)) return(setNames(idx, names)) } # a function to arrange the second df lookup <- normalize(df2[,1], ",") # a function to match them and give the IDs process <- function(s) { lookup_try <- lookup[names(s)] found <- which(
  • 合并重复的行(Consolidate duplicate rows)
    问题 我有一个数据框,其中一栏是物种名称,第二栏是丰度值。 由于采样程序的缘故,某些物种出现了不止一次(即,其中存在多于一个物种X的行)。 我想合并这些条目并总结其丰度。 例如,给定此数据框: set.seed(6) df=data.frame( x=c("sp1","sp2","sp3","sp3","sp4","sp2","sp3"), y=rpois(7,2)); df 产生: x y 1 sp1 2 2 sp2 4 3 sp3 1 4 sp3 1 5 sp4 3 6 sp2 5 7 sp3 5 我想改为产生: x y 1 sp1 2 2 sp2 9 (5+4) 3 sp3 7 (5+1+1) 5 sp4 3 在此先感谢您提供的任何帮助! 回答1 这有效: library(plyr) ddply(df,"x",numcolwise(sum)) 换句话说:(1)将数据帧df划分为"x"列; (2)对于每个块,取每个数值列的总和; (3)将结果粘贴回单个数据帧中。 ( dd在ddply代表“采取d ATA帧作为输入,返回一个d ATA帧”) 另一种可能更清晰的方法: aggregate(y~x,data=df,FUN=sum) 请参阅快速/优雅的方法来为相关(稍微复杂一点)的问题构建均值/方差汇总表。 回答2 简单的aggregate : aggregate(df['y']
  • rbind数据框具有不同的列名(rbind dataframes with a different column name)
    问题 我有12个数据帧,每个数据帧包含6列:5个具有相同的名称,1个不同。 然后,当我调用rbind()我得到: Error in match.names(clabs, names(xi)) : names do not match previous names 不同的列是:“ goal1Completions”。 有12个目标完成...它们是:“ goal1Completions”,“ goal2Completions”,“ goal3Completions” ...等。 我能想到的最好的方法是:将每个数据帧中的每一列重命名为“ GoalsCompletions”,然后使用“ rbind()”。 有没有更简单的方法? 在Google O上查找发现此包:“ gtools”。 它具有一个称为:“ smartbind”的功能。 但是,在使用smartbind()之后,我想用“ View()”查看数据框,我的R会话崩溃了... 我的数据(第一个数据框的示例): date source medium campaign goal1Completions ad.cost Goal 1 2014-10-01 (direct) (none) (not set) 0 0.0000 Vida 2 2014-10-01 Master email CAFRE 0 0.0000 Vida 3 2014-10
  • 合并多个CSV文件并删除R中的重复项(Merge multiple CSV files and remove duplicates in R)
    问题 我有将近3.000个具有相同格式的CSV文件(包含推文),我想将这些文件合并为一个新文件并删除重复的推文。 我遇到过讨论类似问题的各种主题,但是文件数量通常很少。 希望您能帮助我在R中编写代码,以高效地完成这项工作。 CSV文件具有以下格式: CSV格式的图片: 我(在第2和3栏中)将用户名(在Twitter上)更改为AE,将“实际名称”更改为A1-E1。 原始文本文件: "tweet";"author";"local.time" "1";"2012-06-05 00:01:45 @A (A1): Cruijff z'n met-zwart-shirt-zijn-ze-onzichtbaar logica is even mooi ontkracht in #bureausport.";"A (A1)";"2012-06-05 00:01:45" "2";"2012-06-05 00:01:41 @B (B1): Welterusten #BureauSport";"B (B1)";"2012-06-05 00:01:41" "3";"2012-06-05 00:01:38 @C (C1): Echt ..... eindelijk een origineel sportprogramma #bureausport";"C (C1)";"2012-06-05 00:01:38
  • 如何在R中将行添加到带有标题的空数据框中? [复制](How to add rows to empty data frames with header in R? [duplicate])
    问题 这个问题在这里已经有了答案: 8 年前关闭。 可能的重复: R:将行添加到空数据框时丢失列名 我创建了一个空数据框,列名如下 > compData <- data.frame(A= numeric(0), B= numeric(0)) > compData [1] A B <0 rows> (or 0-length row.names) > compData <- rbind(compData,c(5,443)) > compData X5 X443 1 5 443 在上面添加一行后,列名发生了变化。 如何将新行数据添加到数据框中? 回答1 添加到零行data.frame将与添加到已经包含行的data.frame不同 从?rbind rbind 数据框方法首先删除所有零列和零行参数。 (如果没有,则返回带有列的第一个参数,否则返回零列零行数据框。)然后从第一个数据框中获取列的类,并按名称(而不是按位置)匹配列. 因子根据需要扩展其水平(按照遇到的因子水平集的水平顺序),并且当且仅当所有成分都是有序因子时,结果是有序因子。 (最后一点与 S-PLUS 不同。)旧式类别(带水平的整数向量)被提升为因子。 你有很多选择—— 最直接的 compData[1, ] <- c(5, 443) 更复杂 或者您可以将c(5,433)强制转换为列表或 data.frame rbind
  • Selecting rows from a data frame from combinations of lists [duplicate]
    This question already has answers here: Removing one table from another in R [closed] (3 answers) Closed 3 years ago. I have a dataframe, dat: dat<-data.frame(col1=rep(1:4,3), col2=rep(letters[24:26],4), col3=letters[1:12]) I want to filter dat on two different columns using ONLY the combinations given by the rows in the data frame filter: filter<-data.frame(col1=1:3,col2=NA) lists<-list(list("x","y"),list("y","z"),list("x","z")) filter$col2<-lists So for example, rows containing (1,x) and (1,y), would be selected, but not (1,z),(2,x), or (3,y). I know how I would do it using a for loop:
  • rbind data frames, duplicated rownames issue
    While duplicated row (and column) names are allowed in a matrix, they are not allowed in a data.frame. Trying to rbind() some data frames having row names in common highlights this problem. Consider two data frames below: foo = data.frame(a=1:3, b=5:7) rownames(foo)=c("w","x","y") bar = data.frame(a=c(2,4), b=c(6,8)) rownames(bar)=c("x","z") # foo bar # a b a b # w 1 5 x 2 6 # x 2 6 y 4 8 # y 3 7 Now trying to rbind() them (Pay attention to the row names): rbind(foo, bar) # a b # w 1 5 # x 2 6 # y 3 7 # x1 2 6 # z 4 8 But for the case of matrix: rbind(as.matrix(foo), as.matrix(bar)) # a b # w
  • Merge data sets by row differening columns [duplicate]
    This question already has answers here: Combine two data frames by rows (rbind) when they have different sets of columns (13 answers) Closed 3 years ago. I have the need to merge data sets by row but they have differing columns. How can I easily get R to merge the rows, add missing columns and fill in the missing columns with NAs? Currently I would do it like this (very time consuming for multiple merges): Creating fake data... x1<-LETTERS[1:3] x2<-letters[1:3] x3<-rnorm(3) x4<-rnorm(3) x5<-rnorm(3) Example of multiple data.frames with some similar columns, some different... data.frame(x1,x2
  • R rbind错误row.names不允许重复(R rbind error row.names duplicates not allowed)
    问题 这里还有其他问题可以解决相同的问题,但是我没有意识到如何基于它解决我的问题。 因此,我有5个数据框,我想使用rbind合并一个唯一的数据框中的行,但是它返回错误: “ row.names<-.data.frame ( *tmp* ,value = value)中的错误:'row.names'不允许重复。此外:警告消息:设置'row.names'时的值不唯一:'1 ','10','100','1000','10000','100000','1000000','1000001 [....]“ 数据帧具有相同的列,但行数不同。 我以为rbind命令将第一列作为row.names。 因此,尝试在五个数据帧中放置一个顺序ID,但这是行不通的。 我试图通过row.names()指定数据帧中的顺序行名,但也没有成功。 我认为merge命令不是一个选项,因为有5个数据帧,并且连续的合并将覆盖先例。 我创建了一个仅具有ID的新数据框,并尝试加入,但结果数据框未附加已加入df的列。 遵循df 1的摘录: id image power value pol class 1 1 tsx_sm_hh 0.1834515 -7.364787 hh FR 2 2 tsx_sm_hh 0.1834515 -7.364787 hh FR 3 3 tsx_sm_hh 0.1991938 -7.007242 hh
  • 逐行创建 R 数据框(Creating an R dataframe row-by-row)
    问题 我想在 R 中逐行构建一个数据框。我已经做了一些搜索,我想出的只是创建一个空列表的建议,保留一个列表索引标量,然后每次都添加到列表中一个单行数据框并将列表索引推进一。 最后, do.call(rbind,)就行了。 虽然这有效,但似乎非常麻烦。 没有更简单的方法来实现相同的目标吗? 显然,我指的是无法使用某些apply函数并且明确需要逐行创建数据框的情况。 至少,有没有办法push入列表的末尾而不是明确跟踪使用的最后一个索引? 回答1 您可以通过附加或使用rbind()逐行增加它们。 那并不意味着你应该。 动态增长的结构是在 R 中编码效率最低的方法之一。 如果可以,请预先分配整个 data.frame: N <- 1e4 # total number of rows to preallocate--possibly an overestimate DF <- data.frame(num=rep(NA, N), txt=rep("", N), # as many cols as you need stringsAsFactors=FALSE) # you don't know levels yet 然后在您的操作过程中一次插入一行 DF[i, ] <- list(1.4, "foo") 这应该适用于任意 data.frame 并且效率更高。 如果你超过 N
  • 删除重复的行(Remove duplicated rows)
    问题 我已将CSV文件读入R data.frame。 某些行在其中一列中具有相同的元素。 我想删除该列中重复的行。 例如: platform_external_dbus 202 16 google 1 platform_external_dbus 202 16 space-ghost.verbum 1 platform_external_dbus 202 16 localhost 1 platform_external_dbus 202 16 users.sourceforge 8 platform_external_dbus 202 16 hughsie 1 我只希望这些行中的一个,因为其他行在第一列中具有相同的数据。 回答1 只需将数据框隔离到所需的列,然后使用独特的功能:D # in the above example, you only need the first three columns deduped.data <- unique( yourdata[ , 1:3 ] ) # the fourth column no longer 'distinguishes' them, # so they're duplicates and thrown out. 回答2 对于来这里寻找删除重复行的一般答案的人,请使用!duplicated() : a <- c(rep("A"
  • R rbind error row.names duplicates not allowed
    There are other issues here addressing the same question, but I don't realize how to solve my problem based on it. So, I have 5 data frames that I want to merge rows in one unique data frame using rbind, but it returns the error: "Error in row.names<-.data.frame(*tmp*, value = value) : 'row.names' duplicated not allowed In addition: Warning message: non-unique values when setting 'row.names': ‘1’, ‘10’, ‘100’, ‘1000’, ‘10000’, ‘100000’, ‘1000000’, ‘1000001 [....]" The data frames have the same columns but different number of rows. I thought the rbind command took the first column as row.names
  • 合并data.frames以求和R中相同列的值(Combine data.frames summing up values of identical columns in R)
    问题 我在站点内有3个数据框(行:站点,列:物种名称)。 行号相同,但列号不同,因为在所有三个数据帧中并非所有种类都相同。 我想将它们合并到一个数据框中,并总结出大量相同的物种。 例如: data.frame1 Sp1 Sp2 Sp3 Sp4 site1 1 2 3 1 site2 0 2 0 1 site3 1 1 1 1 data.frame2 Sp1 Sp2 Sp4 site1 0 1 2 site2 1 2 0 site3 1 1 1 data.frame3 Sp1 Sp2 Sp5 Sp6 site1 0 1 1 1 site2 1 1 1 5 site3 2 0 0 0 我想要的是这样的: Sp1 Sp2 Sp3 Sp4 Sp5 Sp6 site1 1 4 3 3 1 1 site2 2 5 0 1 1 5 site3 4 2 1 2 0 0 我想我必须使用合并,但是到目前为止,我的尝试未能获得我想要的。 任何帮助表示赞赏。 回答1 我会像这样使用plyr的rbind.fill : pp <- cbind(names=c(rownames(df1), rownames(df2), rownames(df3)), rbind.fill(list(df1, df2, df3))) # names Sp1 Sp2 Sp3 Sp4 Sp5 Sp6 # 1 site1 1 2 3
  • R:从一个数据框中删除另一个数据框中的行(R: remove rows from one data frame that are in another)
    问题 我有两个数据框 df1 和 df2。 它们具有相同的(两)列。 我想从 df1 中删除 df2 中的行。 回答1 你可以用几个包来做到这一点。 但这里是如何使用基础 R 做到这一点。 df1 <-matrix(1:6,ncol=2,byrow=TRUE) df2 <-matrix(1:10,ncol=2,byrow=TRUE) all <-rbind(df1,df2) #rbind the columns #use !duplicated fromLast = FALSE and fromLast = TRUE to get unique rows. all[!duplicated(all,fromLast = FALSE)&!duplicated(all,fromLast = TRUE),] [,1] [,2] [1,] 7 8 [2,] 9 10 回答2 试试这个: df2 <-matrix(1:6,ncol=2,byrow=TRUE) df1 <-matrix(1:10,ncol=2,byrow=TRUE) data.frame(v1=setdiff(df1[,1], df2[,1]), v2=setdiff(df1[,2], df2[,2])) v1 v2 1 7 8 2 9 10 请注意, df1和df2与 Lapointe 的相同,但反过来,因为您想从 df1
  • 比较两个data.frame以找到data.frame 1中不存在的行。(Compare two data.frames to find the rows in data.frame 1 that are not present in data.frame 2)
    问题 我有以下2个data.frames: a1 <- data.frame(a = 1:5, b=letters[1:5]) a2 <- data.frame(a = 1:3, b=letters[1:3]) 我想找到a1没有的行。 是否有针对此类操作的内置功能? (ps:我确实为此写了一个解决方案,我只是好奇是否有人已经编写了更精心设计的代码) 这是我的解决方案: a1 <- data.frame(a = 1:5, b=letters[1:5]) a2 <- data.frame(a = 1:3, b=letters[1:3]) rows.in.a1.that.are.not.in.a2 <- function(a1,a2) { a1.vec <- apply(a1, 1, paste, collapse = "") a2.vec <- apply(a2, 1, paste, collapse = "") a1.without.a2.rows <- a1[!a1.vec %in% a2.vec,] return(a1.without.a2.rows) } rows.in.a1.that.are.not.in.a2(a1,a2) 回答1 这不会直接回答您的问题,但会为您提供共同的要素。 这可以通过Paul Murrell的软件包比较来完成: library(compare) a1
  • R从一个数据框中选择没有出现在另一个数据框中的所有行(R selecting all rows from a data frame that don't appear in another)
    问题 我正在尝试解决一个棘手的 R 问题,我无法通过谷歌搜索关键字解决这个问题。 具体来说,我试图将一个数据帧的子集取其值不会出现在另一个数据帧中。 下面是一个例子: > test number fruit ID1 ID2 item1 "number1" "apples" "22" "33" item2 "number2" "oranges" "13" "33" item3 "number3" "peaches" "44" "25" item4 "number4" "apples" "12" "13" > test2 number fruit ID1 ID2 item1 "number1" "papayas" "22" "33" item2 "number2" "oranges" "13" "33" item3 "number3" "peaches" "441" "25" item4 "number4" "apples" "123" "13" item5 "number3" "peaches" "44" "25" item6 "number4" "apples" "12" "13" item7 "number1" "apples" "22" "33" 我有两个数据框,test 和 test2,目标是选择 test2 中没有出现在 test 中的所有整行,即使某些值可能相同。
  • 如何每隔一行将行添加到R数据框中?(How can I add rows to an R data frame every other row?)
    问题 简介:如何将m行添加到我的m X n数据帧中,其中每个新行都插入到每个现有行之后? 实际上,我将复制现有的行,但对一个变量进行更改。 更详细:关于另一个问题,我认为我可以使用rgl的segments3d函数来完成我想做的事情。 我有一组x,y,z点,但是这些只是一组线段的一个端点。 另一个端点在Z维度上相距几米,作为第四个变量给出:X,Y,Z,Z_Length; 用我的术语来说是东,北,高,长。 根据rgl文档,“点是由segments3d成对获取的”。 因此,我认为我需要修改数据帧,以使每隔第二行具有更改的Z变量(通过从Z减去Z_Length)获得额外的条目。 从视觉上讲,它需要这样做: +-------+---------+----------+-----------+---------+ | Label | easting | northing | elevation | length | +-------+---------+----------+-----------+---------+ | 47063 | 554952 | 5804714 | 32.68 | 619.25 | | 47311 | 492126 | 5730703 | 10.40 | 1773.00 | +-------+---------+----------+-----------+-----
  • 按行将矩阵列表组合为单个矩阵(Combine a list of matrices to a single matrix by rows)
    问题 假设我有一个矩阵列表(均具有相同的列数)。 如何将这些矩阵按行追加/合并(“行绑定”, rbind )以获得单个矩阵? 样本: > matrix(1, nrow=2, ncol=3) [,1] [,2] [,3] [1,] 1 1 1 [2,] 1 1 1 > matrix(2, nrow=3, ncol=3) [,1] [,2] [,3] [1,] 2 2 2 [2,] 2 2 2 [3,] 2 2 2 > m1 <- matrix(1, nrow=2, ncol=3) > m2 <- matrix(2, nrow=3, ncol=3) 现在,列表中可以有很多矩阵,假设我们只有两个: l <- list(m1, m2) 我想实现以下目标: > rbind(m1, m2) [,1] [,2] [,3] [1,] 1 1 1 [2,] 1 1 1 [3,] 2 2 2 [4,] 2 2 2 [5,] 2 2 2 我可以轻松地在2个矩阵上执行此操作,但不确定如何使用矩阵列表进行操作。 回答1 使用do.call(rbind,...) > m1 <- matrix(1, nrow=2, ncol=3) > m2 <- matrix(2, nrow=3, ncol=3) > l <- list(m1, m2) > do.call(rbind, l) [,1] [,2] [,3] [1
  • rbind多个数据集(rbind multiple data sets [duplicate])
    问题 这个问题已经在这里有了答案: 合并(绑定)数据框并创建具有原始数据框名称的列(6个答案) 1年前关闭。 我有3个数据集,我想一起整理。 我已将自己的列重命名为相同的名称: names(DF1) <- c("A", "B", "C") names(DF2) <- c("A", "B", "C") names(DF3) <- c("A", "B", "C") 他们每个人都有不同数量的观察值(分别为34、54、23) 但是,当我尝试使用rbind函数时,它将返回错误: total <- rbind(DF1, DF2, DF3) match.names(clabs,names(xi))中的错误:名称与先前的名称不匹配 从其他回答的问题来看,由于列名不同,应该会出现错误,但是我检查并重新检查了它们是否已重命名。 我想得出一个总数据集,其中包含111个带有列标题的观察值。 我是R的初学者,因此许多其他问题的答案使我难以理解。 任何人都可以用外行的方式回答这个问题吗? 回答1 您可以使用do.call ,如下所示: do.call("rbind", list(DF1, DF2, DF3)) 请注意, do.call第二个参数是一个列表。 回答2 这可以帮助您: 您可以使用rbind.fill包中的plyr (即使列名不同也可以使用) 这是R中optmatch包中数据集的示例 library