gpt4 book ai didi

r - 关于data.frame,如何先循环列名再循环列的行名?

转载 作者:行者123 更新时间:2023-12-04 01:23:31 27 4
gpt4 key购买 nike

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 使用 + collapseing 和 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com