R列表:为每个变量元素添加名称属性



我有以下data.frame:

> mydf=data.frame(ID=LETTERS, var1=rep(c('a','b'),each=13), var2=c(rep('x',10),rep('y',12),rep('z',4)))
> mydf
ID var1 var2
1   A    a    x
2   B    a    x
3   C    a    x
4   D    a    x
5   E    a    x
...

我想列出每个变量的级别。

列表中的每个元素都应该与一个names属性相关联。

名称应与原始元素相同。然后我希望将值更改为变量名+原始元素。

让我告诉你我的意思。

我首先将data.frame转换为我想要的list输出:

> mylist=lapply(mydf, unique)
> mylist
$ID
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
[20] "T" "U" "V" "W" "X" "Y" "Z"
$var1
[1] "a" "b"
$var2
[1] "x" "y" "z"

现在,我想给元素添加一个names属性,这样名称就等于原始元素,而新元素就是变量名加上原始元素。

我专注于var1:

> var1_names=mylist$var1
> var1_values=paste0('var1:',mylist$var1)
> mylist$var1=var1_values
> names(mylist$var1)=var1_names
> mylist
...
$var1
a        b
"var1:a" "var1:b"
...

查看var1如何从:

$var1
[1] "a" "b"

$var1
a        b
"var1:a" "var1:b"

请注意names属性以及新值是如何更改为包含变量名的。

现在我想对列表中的每个变量做同样的事情。

有没有可能用apply方法,最好是基函数,以一种简单的方式做到这一点?谢谢

EDIT:最终完整输出如下(注意每个变量中的names属性(:

> mylist
$ID
A      B      C      D      E      F      G      H      I      J
"ID:A" "ID:B" "ID:C" "ID:D" "ID:E" "ID:F" "ID:G" "ID:H" "ID:I" "ID:J"
K      L      M      N      O      P      Q      R      S      T
"ID:K" "ID:L" "ID:M" "ID:N" "ID:O" "ID:P" "ID:Q" "ID:R" "ID:S" "ID:T"
U      V      W      X      Y      Z
"ID:U" "ID:V" "ID:W" "ID:X" "ID:Y" "ID:Z"
$var1
a        b
"var1:a" "var1:b"
$var2
x        y        z
"var2:x" "var2:y" "var2:z"

更新:在@akrun的帮助下(非常感谢(:

我们可以做:

mydf %>% summarise(across(everything(), ~ list(str_c(cur_column(), unique(.x), sep = ":")))) 
# or 
imap(mydf, ~ str_c(.y, unique(.x), sep = ":"))

你是这个意思?

library(dplyr)
mydf %>% 
mutate(across(starts_with("var"), ~paste0(cur_column(),":", .)))
ID   var1   var2 value
1   A var1:a var2:x     1
2   B var1:a var2:x     2
3   C var1:a var2:x     3
4   D var1:a var2:x     4
5   E var1:a var2:x     5
6   F var1:a var2:x     6
7   G var1:a var2:x     7
8   H var1:a var2:x     8
9   I var1:a var2:x     9
10  J var1:a var2:x    10
11  K var1:a var2:y    11
12  L var1:a var2:y    12
13  M var1:a var2:y    13
14  N var1:b var2:y    14
15  O var1:b var2:y    15
16  P var1:b var2:y    16
17  Q var1:b var2:y    17
18  R var1:b var2:y    18
19  S var1:b var2:y    19
20  T var1:b var2:y    20
21  U var1:b var2:y    21
22  V var1:b var2:y    22
23  W var1:b var2:z    23
24  X var1:b var2:z    24
25  Y var1:b var2:z    25
26  Z var1:b var2:z    26

这就是你想要的吗?

lapply(names(mydf), (x) paste(x, unique(mydf[[x]]), sep = ":"))
[[1]]
[1] "ID:A" "ID:B" "ID:C" "ID:D" "ID:E" "ID:F" "ID:G" "ID:H" "ID:I" "ID:J" "ID:K" "ID:L" "ID:M" "ID:N" "ID:O" "ID:P" "ID:Q" "ID:R" "ID:S" "ID:T" "ID:U" "ID:V" "ID:W" "ID:X" "ID:Y" "ID:Z"
[[2]]
[1] "var1:a" "var1:b"
[[3]]
[1] "var2:x" "var2:y" "var2:z"

要添加名称属性,可以使用setNames():

lapply(
names(mydf), 
(x) {
elm = unique(mydf[[x]])
setNames(paste(x, elm, sep = ":"), elm)
}
)

最新更新