将列名称粘贴到R

时间:2017-01-16 20:23:51

标签: r dataframe

希望这不是重复 - 我已经进行了搜索,但找不到我正在寻找的东西。

我在R

中有一个数据帧(df)
  1 2 3 4 5 
1 1 0.5 0.5 0 1
2 0.5 0.5 0.5 0 1
3 1 1 0 0 1
4 1 1 0 0 1 
5 1 1 0 0 1

(1-5表示行和列名称)

我想将列名粘贴到每个单元格,用“:”分隔,以便它看起来像这样:

  1 2 3 4 5 
1 1:1 2:0.5 3:0.5 4:0 5:1 
2 1:0.5 2:0.5 3:0.5 4:0 5:1 
3 1:1 2:1 3:0 4:0 5:1 
4 1:1 2:1 3:0 4:0 5:1 
5 1:1 2:1 3:0 4:0 5:1 

但是,我的实际数据要大得多。

我目前有

apply(df, 2, function(x) paste(colnames(df)[x], x, sep=":"))

当然这不起作用,因为colnames(df)[x]没有任何意义。 我可以在第一个'粘贴'术语中放入任何东西来进行排序吗?还是另一个做得更好的功能?

感谢。

4 个答案:

答案 0 :(得分:4)

作为循环的替代方法,您可以使用col(., as.factor = TRUE)创建列名称矩阵,然后将其粘贴到数据(强制转换为矩阵)。

df[] <- paste(col(df, TRUE), as.matrix(df), sep = ":")

导致:

      1     2     3   4   5
1   1:1 2:0.5 3:0.5 4:0 5:1
2 1:0.5 2:0.5 3:0.5 4:0 5:1
3   1:1   2:1   3:0 4:0 5:1
4   1:1   2:1   3:0 4:0 5:1
5   1:1   2:1   3:0 4:0 5:1

实际上,使用这些特定的列名称,as.factor = TRUE不是必需的。但是列名称与列号不同是必要的。对于这个特定的例子,它可能是

df[] <- paste(col(df), as.matrix(df), sep = ":")

P.S。您应该使用具有100%数字数据的矩阵,而不是数据框。

数据:

df <- structure(list(`1` = c(1, 0.5, 1, 1, 1), `2` = c(0.5, 0.5, 1, 
1, 1), `3` = c(0.5, 0.5, 0, 0, 0), `4` = c(0L, 0L, 0L, 0L, 0L
), `5` = c(1L, 1L, 1L, 1L, 1L)), .Names = c("1", "2", "3", "4", 
"5"), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5"))

答案 1 :(得分:4)

要解释我的评论,Maplapply的多变量版本,所以

df <- data.frame(`1` = c(1, 0.5, 1, 1, 1), 
                 `2` = c(0.5, 0.5, 1, 1, 1), 
                 `3` = c(0.5, 0.5, 0, 0, 0), 
                 `4` = c(0L, 0L, 0L, 0L, 0L), 
                 `5` = c(1L, 1L, 1L, 1L, 1L), 
                 check.names = FALSE)

df[] <- Map(paste, names(df), df, sep = ':')

df
##       1     2     3   4   5
## 1   1:1 2:0.5 3:0.5 4:0 5:1
## 2 1:0.5 2:0.5 3:0.5 4:0 5:1
## 3   1:1   2:1   3:0 4:0 5:1
## 4   1:1   2:1   3:0 4:0 5:1
## 5   1:1   2:1   3:0 4:0 5:1

此处Mapnames(df)的第一个元素(即1)和paste带到df的第一个元素,即第一列。分配给df[]会保留列表的data.frame类,从而保留原始结构。

如果您的数据是矩阵,则可以使用sweep执行相同的操作:

mat <- matrix(c(1, 0.5, 1, 1, 1, 0.5, 0.5, 1, 1, 1, 0.5, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1), 
              5, 5, 
              dimnames = list(c("1", "2", "3", "4", "5"), 
                              c("1", "2", "3", "4", "5")))

mat[] <- sweep(mat, 2, colnames(df), function(x, y) paste(y, x, sep = ':'))

mat
##   1       2       3       4     5    
## 1 "1:1"   "2:0.5" "3:0.5" "4:0" "5:1"
## 2 "1:0.5" "2:0.5" "3:0.5" "4:0" "5:1"
## 3 "1:1"   "2:1"   "3:0"   "4:0" "5:1"
## 4 "1:1"   "2:1"   "3:0"   "4:0" "5:1"
## 5 "1:1"   "2:1"   "3:0"   "4:0" "5:1"

答案 2 :(得分:1)

我们可以unlist使用列名的复制元素paste数据集和df[] <- paste(names(df)[col(df)], unlist(df), sep=":") df # 1 2 3 4 5 #1 1:1 2:0.5 3:0.5 4:0 5:1 #2 1:0.5 2:0.5 3:0.5 4:0 5:1 #3 1:1 2:1 3:0 4:0 5:1 #4 1:1 2:1 3:0 4:0 5:1 #5 1:1 2:1 3:0 4:0 5:1

df <- structure(list(`1` = c(1, 0.5, 1, 1, 1), `2` = c(0.5, 0.5, 1, 
1, 1), `3` = c(0.5, 0.5, 0, 0, 0), `4` = c(0L, 0L, 0L, 0L, 0L
), `5` = c(1L, 1L, 1L, 1L, 1L)), .Names = c("1", "2", "3", "4", 
 "5"), class = "data.frame", row.names = c("1", "2", "3", "4", 
 "5"))

数据

<my-application color="blue"></my-application>

答案 3 :(得分:0)

要为 tidyverse 更新此内容,您现在可以运行

df <- map2_dfc(colnames(df), df, paste, sep = ':')

map2 为粘贴函数接受 2 个输入,_dfc 标签返回一个数据帧作为结果,而不是一个列表。