小编use*_*898的帖子

将新列添加到表或数据框列表中的每个元素

我有一个文件列表.我还有一个"名称"列表,我substr()从这些文件的实际文件名中获取.我想为列表中的每个文件添加一个新列.此列将包含"names"中相应元素,重复次数为文件中的行数.

例如:

df1 <- data.frame(x = 1:3, y=letters[1:3])
df2 <- data.frame(x = 4:6, y=letters[4:6])
filelist <- list(df1,df2)
ID <- c("1A","IB")
Run Code Online (Sandbox Code Playgroud)

伪代码

  for( i in length(filelist)){

       filelist[i]$SampleID <- rep(ID[i],nrow(filelist[i])

  }
Run Code Online (Sandbox Code Playgroud)

//基本上在filelist的每个数据框中创建一个新列,并用重复的相应ID值填充该列

我的输出应该是这样的:

filelist[1] 应该:

   x y SAmpleID
 1 1 a       1A
 2 2 b       1A
 3 3 c       1A
Run Code Online (Sandbox Code Playgroud)

fileList[2]

   x y SampleID
 1 4 d       IB
 2 5 e       IB
 3 6 f       IB
Run Code Online (Sandbox Code Playgroud)

等等.....

任何想法如何做到这一点.

r

36
推荐指数
4
解决办法
4万
查看次数

在R中循环的替代方案

df1 <- data.frame(Chr=1, Pos= c(100,200,300,400),stringsAsFactors=F)

df2 <- data.frame(Chr=1, PosStart= c(25,25,150,175,225,275,375),PosEnd= c(150,75,275,300,400,500,750),stringsAsFactors=F)
Run Code Online (Sandbox Code Playgroud)

我想比较Posdf1,看看是否任何的落差PosStartPosEnddf2.对于超过1行的情况,这可能是真的df2.在输出中,我试图将其df1$Pos作为新列附加df2$CoPos; 每次条件成立.输出应该是这样的:

Chr PosStart PosEnd CoPos
1       25    150   100
1      150    275   200
1      175    300   200
1      225    400   300
1      275    500   300
1      375    750   400
Run Code Online (Sandbox Code Playgroud)

我做过类似的事情:

for(i in 1:length(df1$Pos)){

    for(j in 1:length(df2$PosStart){

            df2$CoPos[j]<- df1$Pos[which(df2$PosStart[j] < df1$Pos[i] < df2$PosEnd[j])]
    }

}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我,如果没有循环,有没有办法做到这一点.我在这里做错了什么?经过几个月的挣扎,我不认为我仍然理解循环的概念.

提前感谢一堆.

r

1
推荐指数
1
解决办法
231
查看次数

标签 统计

r ×2