我有一个数据集,其中一堆字符列只有一个值,即列本身的名称。每一行都是一个观察值,我想计算每一行有多少这样的列。
例如:
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_if
和n_distinct
,将字符串替换为TRUE
,然后可以将它们用在mutate
中,并带有rowSums:
data %>%
mutate_if(~n_distinct(.) == 1, TRUE, .) %>%
mutate(count = rowSums???)
但是,我无法使mutate_if
正常工作,并且我也不知道rowSums命令—在行之间是否存在sum_if TRUE运算符?
答案 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] != "")