我有两个不同的数据帧,分别是df1和df2:
adapter.notifyDataSetChanged()
我想为每个班级和班长按df1获得以Temps为单位的频率。 Temp1对应于A1,Temp2对应于A2,依此类推。因此,例如 如果在Temp1中看到值<12(请参见Head for A1),我将对其进行计数。在Temp1中,Head中的所有值都大于12,因此A1的No = 0。对于A2,您在df1中看到11,所以我需要 查看Temp2,我看到3个值(8,2,7)小于11,所以A2的No = 3,依此类推...
我想得到以下结果:
df1 <- read.table(text = " Class Head Group
A1 12 1
A2 11 2
A3 10 1
A4 9 2
A5 10 1
", header = TRUE)
df2 <- read.table(text = " Temp1 Temp2 Temp3 Temp4 Temp5
13 13 14 11 17
13 8 19 14 15
14 2 20 15 14
15 7 9 19 9
", header = TRUE)
答案 0 :(得分:0)
我们可以将第二个数据集转换为'long'格式,执行left_join
并获得逻辑表达式的计数
library(dplyr)
library(tidyr)
df2 %>%
rename_all(~ as.character(df1$Class)) %>%
pivot_longer(everything(), names_to = 'Class') %>%
left_join(df1) %>%
group_by(Class) %>%
summarise(Head = first(Head), No = sum(value < Head))
# A tibble: 5 x 3
# Class Head No
# <chr> <int> <int>
#1 A1 12 0
#2 A2 11 3
#3 A3 10 1
#4 A4 9 0
#5 A5 10 1
在base R
中,我们可以复制“ Head”列,并使用它进行比较
df1$No <- colSums(df2 < df1$Head[col(df2)])
df1[-3]
# Class Head No
#1 A1 12 0
#2 A2 11 3
#3 A3 10 1
#4 A4 9 0
#5 A5 10 1
答案 1 :(得分:0)
一种base R
解决方案可能是:
df1$No <- colSums(sweep(df2, 2, FUN = "<", df1$Head))
Class Head Group No
1 A1 12 1 0
2 A2 11 2 3
3 A3 10 1 1
4 A4 9 2 0
5 A5 10 1 1