根据条件从数据帧创建具有二进制值的df

时间:2019-05-10 14:35:25

标签: r dataframe logic

我有一个数据框,例如;

   Groups   Value
    G1  NA
    G1  NA
    G1  NA
    G1  23
    G2  NA
    G2  NA
    G2  NA
    G2  NA
    G2  NA
    G2  NA
    G3  34
    G3  21
    G4  NA
    G4  NA
    G5  NA
    G5  45

并且我正在寻找R中的代码,以便获得另一个具有二进制值的数据帧(组中至少一个值是1等于1且1)(仅包含NA值的组0表示)< / p>

并获得一个新的数据报,例如:

G1  G2  G3  G4  G5
1   0   1   0   1

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

我们可以处理table中的base R。获取“值”列作为逻辑矢量(!is.na),并找到带有“组”的频率表,检查频率是否大于0,使用as.integer将逻辑矢量转换为二进制或+

+(table(df1$Groups, !is.na(df1$Value))[,2] > 0)
# G1 G2 G3 G4 G5 
# 1  0  1  0  1 

或使用rowsum中的base R

rowsum(+!is.na(df1$Value), df1$Groups)

注意:以上两种方法均为base R-未使用任何包


或使用tidyverse

library(tidyverse)
df1 %>% 
  group_by(Groups) %>%
  summarise_all(list(~ as.integer(sum(!is.na(.)) > 0)))
# A tibble: 5 x 2
#  Groups Value
#   <chr>  <int>
#1 G1         1
#2 G2         0
#3 G3         1
#4 G4         0
#5 G5         1

或与data.table

library(data.table)
setDT(df1)[, +(sum(!is.na(Value)) > 0), Groups]

数据

df1 <- structure(list(Groups = c("G1", "G1", "G1", "G1", "G2", "G2", 
"G2", "G2", "G2", "G2", "G3", "G3", "G4", "G4", "G5", "G5"), 
    Value = c(NA, NA, NA, 23L, NA, NA, NA, NA, NA, NA, 34L, 21L, 
    NA, NA, NA, 45L)), class = "data.frame", row.names = c(NA, 
-16L))

答案 1 :(得分:1)

使用,您还可以执行以下操作:

dplyr

或者:

df %>%
 group_by(Groups) %>%
 summarise(Value = as.integer(any(!is.na(Value))))

  Groups Value
  <chr>  <int>
1 G1         1
2 G2         0
3 G3         1
4 G4         0
5 G5         1

答案 2 :(得分:1)

我们可以使用基数R computed

aggregate

如果您需要aggregate(Value > 1~Groups, df1, any, na.rm = TRUE, na.action = na.pass) # Groups Value > 1 #1 G1 TRUE #2 G2 FALSE #3 G3 TRUE #4 G4 FALSE #5 G5 TRUE 而不是1/0值,则可以

TRUE/FALSE

答案 3 :(得分:0)

通过使用循环条件,我们可以提取相同的

数据

data <- data.frame (Groups =rep(c("G1","G2"), each = 4),  Value = c(NA,NA,NA,23,NA,NA,NA,NA))

循环

for (i in unique(data$Groups)){
  data$new_value[data$Groups==i] <- ifelse(sum(data$Value[data$Groups==i],na.rm = T)>1,1,0)
}


data1 <- unique(data[,c(1,3)])

Groups new_value
  G1         1
  G2         0