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
我们可以使用基本Raggregate
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