我有一个包含29行和26列的数据框,其中包含很多NA' s。数据看起来有点像下面所示(在R studio上工作)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
a1 b1 d1 d2 d3 d4 d5 na na e2
a1 b2 d2 d4 d1 e2 na e1 na na
a1 b3 d5 d3 d1 d4 na na e1 e2
a2 c1 e1 e2 na e3 na d2 d1 d4
a2 c2 d2 d4 d1 e2 na e1 na na
a2 c3 d5 d3 d1 d4 na na e1 e2
这里有V1-V10柱 a1和a2是第1列中的2个不同值 列V2中的b1-b3是与V1中的a1相关的不同值 在列V3-V10中,我们每行都有不同的值
我想要的结果如下 -
NewV1 Newv2 NewV3
a1 3 7
a2 3 8
总结我希望得到(V2的总计数和V3-V10的不同值的计数)基于V1
答案 0 :(得分:1)
看起来,没有人可以重现你的结果。你是否敏感工作?
如果是这样,对于df <- data.frame(lapply(df, function(x) {
if (is.character(x)) return(toupper(x))
else return(x)
}))
方法,您可以尝试:
n_V2 <- df %>%
gather(key, value, - V1, -V2) %>%
group_by(V1) %>%
distinct(V2) %>%
summarise(Newv2=n())
n_Vx <- df %>%
gather(key, value, - V1, -V2) %>%
filter(!is.na(value)) %>%
group_by(V1) %>%
distinct(value) %>%
summarise(Newv3=n())
n_V2 %>% left_join(n_Vx)
因为您的工作区分大小写我们添加:
Joining, by = "V1"
# A tibble: 2 x 3
V1 Newv2 Newv3
<fct> <int> <int>
1 a1 3 7
2 a2 3 8
现在运行:
traces
输出正是你的:
pandas 0.19.0
答案 1 :(得分:0)
根据您的算法说明,您可以使用data.table
:
library("data.table")
dt <- fread(
"V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
a1 b1 d1 d2 d3 d4 d5 NA NA E2
a1 b2 d2 d4 d1 E2 NA E1 NA NA
a1 b3 d5 d3 d1 d4 NA NA E1 E2
a2 c1 E1 E2 NA E3 NA D2 D1 D4
a2 c2 d2 d4 d1 E2 NA E1 NA NA
a2 c3 d5 d3 d1 d4 NA NA E1 E2")
dt[, .(nV2=length(V2), u3.10=uniqueN(na.omit(tolower(unlist(.SD))))), by=V1, .SDcols=3:10]
# V1 nV2 u3.10
# 1: a1 3 7
# 2: a2 3 8
如果您有数据框df
,可以通过以下方式将其强制转换为data.table-object:
setDT(df)
答案 2 :(得分:-1)
您可以使用data.table执行此操作:
library(data.table)
L3 <- LETTERS[1:3]
fac2 <- sample(L3, 10, replace = TRUE)
fac <- sample(L3, 10, replace = TRUE)
d <- data.frame(fac2 = fac2, fac = fac)
dd <- as.data.table(d)
dd[, num := length(unique(fac)), fac2]
dd[, mean(num), fac2]
祝你好运