计算多列中至少出现一次值的行数

时间:2019-04-04 23:17:24

标签: r for-loop dplyr

我用伪代码更新了问题,以更好地解释我想做什么。

我有一个名为 df_sel 的data.frame,具有5064行和215列。

某些列(〜80)包含具有特定特征(药物)唯一标识符的整数。这些列的名称分别为“ meds_0_1”,“ meds_0_2”,“ meds_0_3”等,以及“ meds_1_1”,“ meds_1_2”,“ meds_1_3”。每列可能包含也可能不包含我要查找的任何整数值。

要查找特定的整数值,可以将某些分组为不同类型的药物,但可以针对特定的品牌名称进行编码。

| ?- number_matrix_lines([[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1]], 1, NumberLines).

NumberLines = [machine_penalty(1,[1,1,1,1,1,1,1,1]), machine_penalty(2,[1,1,1,1,1,1,1,1]), machine_penalty(3,[1,1,1,1,1,1,1,1])]
yes

如果可以像上面的矢量格式那样查找一组药物,那将会很有帮助。

我想这样做:

metformin = 1140884600  # not grouped
sulfonylurea = c(1140874718, 1140874724, 1140874726) # grouped

一致地

IF [a specific row] 
CONTAINS [the single integer value of interest] 
IN [any of the columns within the df starting with "meds_0"] 
A_NEW_VARIABLE_METFORMIN = 1 ELSE A_NEW_VARIABLE_METFORMIN = 0

我已经根据列名创建了一个向量:

IF [a specific row] 
CONTAINS [any of multiple integer values of interest] 
IN [any of the columns within the df starting with "meds_0"] 
A_NEW_VARIABLE_SULFONYLUREA = 1 ELSE A_NEW_VARIABLE_SULFONYLUREA = 0

但是,尽管下面有一些建议,我仍然没有任何进一步的认识。

希望您能更好地理解我要做什么。

2 个答案:

答案 0 :(得分:0)

对于列的选择,您可以通过使用正则表达式首先提取名称,然后使用select

library(stringr)
column_names <- names(df_sel) %>% 
  str_subset('^meds_0')

relevant_df <- df_sel %>%
  select(column_names)

我不太了解您的变量的结构(如果它们是整数,逻辑等),所以我不确定如何继续,但是可能涉及到诸如跨所有列求和并删除不为0的那些,例如:

meds_taken <- rowSums(relevant_df)
df_sel_med_count <- df_sel %>% 
  add_column(meds_taken)

这时,您应该将初始df和相关数据放在一栏中,并且可以按主题,药物或任何您想要的方式进行汇总。

如果这还不够,请编辑您的问题以提供数据的相关样本(您可以使用dput函数),我将编辑此答案以添加更多详细信息。

答案 1 :(得分:0)

首先,我想首先为R库推荐生物导体,因为听起来您可能正在研究生物学数据。现在是您的问题。

尽管tidyverse是最广泛接受和“简便”的方法,但在这种情况下,我建议使用“ lapply”,因为它非常快。正如您所说,从编程的角度来看,您的代码将变成一个简单的布尔值,但是我认为我们可以进一步。使用来自“ mtcars”的内置数据,

data(mtcars)
head(mtcars, 6)
target=6

#trues and falses for each row and column

rows=lapply(mtcars, function(x) x %in% target)

#Number of Trues for each column and which have more that 0 Trues

column_sums=unlist(lapply(rows, function(x) (sum(x, na.rm = TRUE))))
which(column_sums>0)

这将与其他数据类型一起使用,并在其中进行一些调整。