我有一个超过100列和150行的dfrm.我需要将每4列的内容合并为1(最好用"/"分隔,虽然可有可无),这很简单,执行apply(dfrm[ ,1:4], 1, paste, collapse="/").我很难将解决方案扩展到我的整个df.换一种说法:
我怎么能这样做:
        loc1   loc1.1 loc1.2 loc1.3 loc2  loc2.1 loc2.2  loc2.3
ind.1    257    262    228    266    204    245    282    132
ind.2    244    115    240    187    196    133    189    251
ind.3    298    139    216    225    219    276    192    254
ind.4    129    176    180    182    215    250    227    186
ind.5    238    217    284    240    131    184    247    168
对于这样的事情:
                 loc1            loc2
ind.1 257/262/228/266 204/245/282/132
ind.2 244/115/240/187 196/133/189/251
ind.3 298/139/216/225 219/276/192/254
ind.4 129/176/180/182 215/250/227/186
ind.5 238/217/284/240 131/184/247/168
在超过100行和列的数据框中.我已经尝试过对这个问题的解决方案中提供的数据框进行索引,但是在创建了每4列的索引后,确实发现自己在尝试执行do.call数据帧时丢失了.我确信必须有一个简单的解决方案,但请记住,我只是精通R.
也; 如果身体处于形状状态,那么这些名字并不是一个真正的问题,因为提取一个名字列表是由loc <- colnames(dfrm)和执行loc <- loc[c(T, F, F, F),然后定义colnames(dfrm) <- loc,尽管如果合并的话会很好.
这当然不是很漂亮,但它有效:
do.call(cbind, lapply(1:ceiling(ncol(df)/4), function(i)
                      apply(df[,seq(4*(i-1)+1, min(4*i, ncol(df))), drop = F],
                            1, paste, collapse = "/")))
#      [,1]              [,2]             
#ind.1 "257/262/228/266" "204/245/282/132"
#ind.2 "244/115/240/187" "196/133/189/251"
#ind.3 "298/139/216/225" "219/276/192/254"
#ind.4 "129/176/180/182" "215/250/227/186"
#ind.5 "238/217/284/240" "131/184/247/168"
该ceiling和drop是否有生存的边缘情况下,当列数不整除4.另外请注意,最终的结果是matrix在这里(感谢apply),并且可以将其转换回data.frame如果你喜欢(并指定任何列名).