我有一个数据框,例如;
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
感谢您的帮助。
答案 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