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

R 根据条件,从数据帧创建具有二进制值的df,r,dataframe,logic,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表示组中至少有一个值为a>=1

我有一个数据帧,如

   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表示组中至少有一个值为a>=1)和(0表示仅包含NA值的组)

并获取新的数据报,如:

G1  G2  G3  G4  G5
1   0   1   0   1

谢谢你的帮助

我们可以从
base R
使用
表格
。以逻辑向量的形式获取“Value”列(
!is.na
),并查找带有“Groups”的频率表,检查频率是否大于0,将逻辑向量转换为二进制,并使用
as.integer
+

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

或者使用
baser中的
rowsum

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
数据
df1使用
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

我们可以使用基本R
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
,您可以这样做

aggregate(Value~Groups, df1, function(x) 
           +(any(x > 1, na.rm = TRUE)), na.action = na.pass)

#  Groups Value
#1     G1     1
#2     G2     0
#3     G3     1
#4     G4     0
#5     G5     1

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

数据
数据谢谢你的帮助:)谢谢你的回答
df %>%
 group_by(Groups) %>%
 summarise(Value = as.integer(max(Value, na.rm = TRUE) > 0))
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
aggregate(Value~Groups, df1, function(x) 
           +(any(x > 1, na.rm = TRUE)), na.action = na.pass)

#  Groups Value
#1     G1     1
#2     G2     0
#3     G3     1
#4     G4     0
#5     G5     1
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