作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
df <- data.frame(
cola = c("A","C",NA,"C"),
colb = c("A",NA,NA,"D"),
colc = c(NA,5,3,NA),
stringsAsFactors = FALSE
)
cola colb colc
1 A A NA
2 C <NA> 5
3 <NA> <NA> 3
4 C D NA
我想先打印列名,然后在单元格值不为 NA 时打印行名,得到如下预期输出:
cola=1+2+4
colb=1+4
colc=2+3
然后我试了:
df %>%
lapply(function(x){
r_name=list()
for(i in x){if(!is.na(i)) {r_name<-list(r_name,rownames(i))}}
paste0(colnames(x),'=',paste(r_name,collapse='+'))
}
)
但是输出是:
$cola
[1] "=list(list(list(), NULL), NULL)+NULL"
$colb
[1] "=list(list(), NULL)+NULL"
$colc
[1] "=list(list(), NULL)+NULL"
问题出在哪里?
最佳答案
我们使用 sapply
遍历数据集的列,获取非 NA 元素的索引,使用它来对 row.names
进行子集化,paste
使用 +
collapse
ing 和 paste
的元素,其中列名为“df”,输出为 sapply
paste(names(df), sapply(df, function(x)
paste(row.names(df)[which(!is.na(x))], collapse="+")), sep="=")
#[1] "cola=1+2+4" "colb=1+4" "colc=2+3"
或者用which/arr.ind
i1 <- which(!is.na(df), arr.ind = TRUE)
paste(names(df), tapply(row.names(df)[i1[,1]], i1[,2],
FUN = paste, collapse="+"), sep="=")
#[1] "cola=1+2+4" "colb=1+4" "colc=2+3"
或者用imap
library(purrr)
library(stringr)
unname(imap_chr(df, ~ str_c(.y, "=",
str_c(row.names(df)[!is.na(.x)], collapse='+'))))
#[1] "cola=1+2+4" "colb=1+4" "colc=2+3"
关于r - 关于data.frame,如何先循环列名再循环列的行名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62237602/
我是一名优秀的程序员,十分优秀!