如何用单个值计算列数?

时间:2019-06-26 00:10:06

标签: r dplyr conditional-statements mutate

我有一个数据集,其中一堆字符列只有一个值,即列本身的名称。每一行都是一个观察值,我想计算每一行有多少这样的列。

例如:

id multi_value_col single_value_col_1 single_value_col_2
1  A               single_value_col_1 
2  D2              single_value_col_1 single_value_col_2
3  Z6                                 single_value_col_2

我想要添加一个列,该列计算每行有多少个单值列。像这样:

id multi_value_col single_value_col_1 single_value_col_2  count
1  A               single_value_col_1                     1 
2  D2              single_value_col_1 single_value_col_2  2
3  Z6                                 single_value_col_2  1

我最初的想法是使用mutate_ifn_distinct,将字符串替换为TRUE,然后可以将它们用在mutate中,并带有rowSums:

data %>% 
 mutate_if(~n_distinct(.) == 1, TRUE, .) %>%
 mutate(count = rowSums???)

但是,我无法使mutate_if正常工作,并且我也不知道rowSums命令—在行之间是否存在sum_if TRUE运算符?

2 个答案:

答案 0 :(得分:3)

如果我们要检查列名,那么

@Directive({
  selector: '[dataResolved]'
})
export class DataResolvedDirective{

  constructor( httpClient: HttpClient ) { // OR DI - Existing Service
    }
  @Input() set dataResolved( ) {
        return this.httpClient.get('remote server url + uri');
    }

或者在library(tidyverse) data %>% mutate(count = pmap_int(.[-1], ~ {x1 <- c(...) sum(x1 == names(x1))} )) # id multi_value_col single_value_col_1 single_value_col_2 count #1 1 A single_value_col_1 1 #2 2 D2 single_value_col_1 single_value_col_2 2 #3 3 Z6 single_value_col_2 1

base R

如果数据集具有NA,只需将其更改为

rowSums(data[-1] == names(data)[-1][col(data[-1])])

@thelatemail建议的其他选项包括转置选定的列,并在逻辑矩阵上进行rowSums(data[-1] == names(data)[-1][col(data[-1])], na.rm = TRUE)

colSums

或与nms <- names(data)[nm1] colSums(t(data[nms]) == nms)

Reduce

如果要基于非空格进行计数,请在Reduce(`+`, Map(`==`, data[nms], nms)) 中创建一个包含感兴趣列的逻辑矩阵,并对其进行base R

rowSums

使用nm1 <- grep("single_value", names(data)) data$count <- rowSums(data[nm1] != "")

dplyr

数据

library(dplyr)
data %>% 
    mutate(count = rowSums(.[nm1] != ""))
#  id multi_value_col single_value_col_1 single_value_col_2 count
#1  1               A single_value_col_1                        1
#2  2              D2 single_value_col_1 single_value_col_2     2
#3  3              Z6                    single_value_col_2     1

答案 1 :(得分:1)

根据数据或空白单元格中是否包含NA,可以使用以下基本R方法之一,我们首先找出仅具有一个唯一值的列,然后计算非NA或非N这些相应列中每行的空白单元格。

如果您有NA

cols <- which(sapply(df, function(x) length(unique(na.omit(x)))) == 1)
df$count <- rowSums(!is.na(df[cols]))

df
#  id multi_value_col single_value_col_1 single_value_col_2 count
#1  1               A single_value_col_1               <NA>     1
#2  2              D2 single_value_col_1 single_value_col_2     2
#3  3              Z6               <NA> single_value_col_2     1

如果您的单元格为空

cols <- which(sapply(df, function(x) length(unique(x[x!=""]))) == 1)
df$count <- rowSums(df[cols] != "")