获取列总计大于 0 的列名称

Sel*_*aly 7 r

我有一个看起来像这样的表:

Name  Grade  Test1   Test2   Test3
Tim   A        0.7     0.0     0.8
Amy   B        0.8     0.0     0.5
John  B        0.6     0.0     0.6
Run Code Online (Sandbox Code Playgroud)

我想要获取数值大于 0 的所有列名的列表:

Test1 # Total would be 2.1
Test3 # Total would be 1.9

# Name and grade ignored as they are not numeric
# Test2 ignored because value is 0
Run Code Online (Sandbox Code Playgroud)

在 R 中如何实现这一点?

Rui*_*das 8

这是一个基本的 R 解决方案。

i <- sapply(df1, is.numeric)
names(df1)[i][colSums(df1[i]) > 0]
#> [1] "Test1" "Test3"
Run Code Online (Sandbox Code Playgroud)

创建于 2023-07-09,使用reprex v2.0.2


数据

df1 <- "Name  Grade  Test1   Test2   Test3
Tim   A        0.7     0.0     0.8
Amy   B        0.8     0.0     0.5
John  B        0.6     0.0     0.6"
df1 <- read.table(text = df1, header = TRUE)
Run Code Online (Sandbox Code Playgroud)

创建于 2023-07-09,使用reprex v2.0.2


Jan*_*Jan 5

library(dplyr)\n\ndf %>%\n    select(where(is.numeric)) |> \n    map_dbl(sum) |> \n    as_tibble(rownames = "Test") |> \n    filter(value > 0.0)\n\n# A tibble: 2 \xc3\x97 2\n  Test  value\n  <chr> <dbl>\n1 Test1   2.1\n2 Test3   1.9\n
Run Code Online (Sandbox Code Playgroud)\n


Tar*_*Jae 5

这是一个tidyverse解决方案:

library(dplyr)
library(tidyr)

df %>% 
  mutate(across(Test1:Test3, ~case_when(. > 0 ~ cur_column()), .names = 'new_{col}')) %>% 
  unite(New_Col, starts_with('new'), na.rm = TRUE, sep = ' ') %>% 
  distinct(New_Col) %>% 
  pull(New_Col)
Run Code Online (Sandbox Code Playgroud)
[1] "Test1 Test3"
Run Code Online (Sandbox Code Playgroud)