我有一个看起来像这样的表:
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 中如何实现这一点?
这是一个基本的 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
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\nRun Code Online (Sandbox Code Playgroud)\n
这是一个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)
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |