如何用Base R的apply方法批量处理列表元素的names属性与值
问题描述
我有如下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转换为目标初始列表:
> 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"
并手动完成了单个变量(如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"
现在我希望对列表中的所有变量执行相同操作,请问能否用Base R的apply类方法简洁实现?
解决方案
当然可以,用Base R的Map()或者带列表名称的lapply()就能批量完成,两种简洁实现方式如下:
方法1:使用Map()函数
Map()可以同时遍历变量名和对应的唯一值集合,代码更紧凑:
# 生成初始唯一值列表 mylist <- lapply(mydf, unique) # 批量处理每个元素 mylist <- Map(function(col_name, vals) { new_vals <- paste0(col_name, ":", vals) names(new_vals) <- vals new_vals }, names(mylist), mylist)
方法2:使用lapply()遍历列表名称
通过遍历原列表的名称,逐个取出对应元素处理:
# 生成初始唯一值列表 mylist <- lapply(mydf, unique) # 批量处理 mylist <- lapply(names(mylist), function(col_name) { vals <- mylist[[col_name]] new_vals <- paste0(col_name, ":", vals) names(new_vals) <- vals new_vals }) # 还原列表的原始名称 names(mylist) <- names(mydf)
执行后得到的结果如下:
> mylist $ID A B C D E F G H I J K L M N O P Q R S T U V W X Y Z "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" $var1 a b "var1:a" "var1:b" $var2 x y z "var2:x" "var2:y" "var2:z"
内容的提问来源于stack exchange,提问作者DaniCee
相关产品推荐
相关产品推荐

