R 如何获取特定列的中间值
我有这样的数据R 如何获取特定列的中间值,r,R,我有这样的数据 df<-structure(list(T = c(36034L, 63763L, 51432L, 65100L, 61444L, 71012L, 266610L, 389787L, 47659L, 63156L, 84593L, 84331L), T.1 = c(45632L, 66505L, 60360L, 36685L, 107551L, 53360L, 323952L, 344944L, 69601L, 51268L, 130665L, 59704L), T.2
df<-structure(list(T = c(36034L, 63763L, 51432L, 65100L, 61444L,
71012L, 266610L, 389787L, 47659L, 63156L, 84593L, 84331L), T.1 = c(45632L,
66505L, 60360L, 36685L, 107551L, 53360L, 323952L, 344944L, 69601L,
51268L, 130665L, 59704L), T.2 = c(59025L, 52837L, 68571L, 35788L,
75262L, 66601L, 424683L, 340948L, 79487L, 42809L, 95607L, 81739L
), BG = c(74767L, 48210L, 70972L, 67705L, 85576L, 89265L, 393380L,
306633L, 77816L, 73611L, 106317L, 116890L), BG.1 = c(50846L,
37970L, 63896L, 78296L, 81216L, 62308L, 62613L, 21770L, 80955L,
88832L, 97586L, 68345L), BG.2 = c(26688L, 27830L, 17010L, 54074L,
26727L, 31109L, 24448L, 38701L, 17378L, 46327L, 25324L, 25325L
), TR = c(16498L, 26604L, 41201L, 38417L, 43709L, 33217L, 69943L,
80638L, 37444L, 31701L, 46781L, 31152L), TR.1 = c(16272L, 24485L,
14546L, 74756L, 28193L, 770L, 72238L, 78418L, 9161L, 48618L,
26466L, 1078L), TR.2 = c(20612L, 713L, 18114L, 57872L, 25684L,
27985L, 73618L, 1770L, 11953L, 33347L, 25824L, 25860L)), row.names = c("A",
"B", "C", "D", "E", "F", "A_Mo1", "B_Mo1", "C_Mo1", "D_Mo1",
"E_Mo1", "F_Mo1"), class = "data.frame")
另一种方式
dataused <- c("1:3","4:6","7:9")
medians <- sapply(dataused,function(y)
c(by(df[,eval(parse(text=y))],median(unlist(x)))))
一种选择是中位数
或者只使用base R
一种选择是中位数
或者只使用base R
您没有指定要计算中位数的列。但是,您可以将apply与MARGIN参数一起使用为1,它按行执行操作。根据data.frame的大小,它可能会稍微低效。假设要对前三列执行此操作:
cols <- c("T", "T.1", "T.2")
newCols <- paste0("median_", paste0(cols, collapse = "_"))
df[[newCols]] <- apply(df[, cols], MARGIN=1, FUN=median)
对于数据完整性,请参见表:
您没有指定要计算中位数的列。但是,您可以将apply与MARGIN参数一起使用为1,它按行执行操作。根据data.frame的大小,它可能会稍微低效。假设要对前三列执行此操作:
cols <- c("T", "T.1", "T.2")
newCols <- paste0("median_", paste0(cols, collapse = "_"))
df[[newCols]] <- apply(df[, cols], MARGIN=1, FUN=median)
为确保完整性,请使用data.table:
您可以使用dplyr和rowwise
df %>% rowwise() %>% mutate(T_median = median(T, T.1, T.2), BG_median = median(BG, BG.1,BG.2), TR_median = median(TR, TR.1, TR.2))
T T.1 T.2 BG BG.1 BG.2 TR TR.1 TR.2 T_median BG_median TR_median
<int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 36034 45632 59025 74767 50846 26688 16498 16272 20612 36034 74767 16498
2 63763 66505 52837 48210 37970 27830 26604 24485 713 63763 48210 26604
3 51432 60360 68571 70972 63896 17010 41201 14546 18114 51432 70972 41201
4 65100 36685 35788 67705 78296 54074 38417 74756 57872 65100 67705 38417
5 61444 107551 75262 85576 81216 26727 43709 28193 25684 61444 85576 43709
6 71012 53360 66601 89265 62308 31109 33217 770 27985 71012 89265 33217
7 266610 323952 424683 393380 62613 24448 69943 72238 73618 266610 393380 69943
8 389787 344944 340948 306633 21770 38701 80638 78418 1770 389787 306633 80638
9 47659 69601 79487 77816 80955 17378 37444 9161 11953 47659 77816 37444
10 63156 51268 42809 73611 88832 46327 31701 48618 33347 63156 73611 31701
11 84593 130665 95607 106317 97586 25324 46781 26466 25824 84593 106317 46781
12 84331 59704 81739 116890 68345 25325 31152 1078 25860 84331 116890 31152
您可以使用dplyr和rowwise
df %>% rowwise() %>% mutate(T_median = median(T, T.1, T.2), BG_median = median(BG, BG.1,BG.2), TR_median = median(TR, TR.1, TR.2))
T T.1 T.2 BG BG.1 BG.2 TR TR.1 TR.2 T_median BG_median TR_median
<int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 36034 45632 59025 74767 50846 26688 16498 16272 20612 36034 74767 16498
2 63763 66505 52837 48210 37970 27830 26604 24485 713 63763 48210 26604
3 51432 60360 68571 70972 63896 17010 41201 14546 18114 51432 70972 41201
4 65100 36685 35788 67705 78296 54074 38417 74756 57872 65100 67705 38417
5 61444 107551 75262 85576 81216 26727 43709 28193 25684 61444 85576 43709
6 71012 53360 66601 89265 62308 31109 33217 770 27985 71012 89265 33217
7 266610 323952 424683 393380 62613 24448 69943 72238 73618 266610 393380 69943
8 389787 344944 340948 306633 21770 38701 80638 78418 1770 389787 306633 80638
9 47659 69601 79487 77816 80955 17378 37444 9161 11953 47659 77816 37444
10 63156 51268 42809 73611 88832 46327 31701 48618 33347 63156 73611 31701
11 84593 130665 95607 106317 97586 25324 46781 26466 25824 84593 106317 46781
12 84331 59704 81739 116890 68345 25325 31152 1078 25860 84331 116890 31152
可以使用“应用族”函数在基础中执行此操作
tapplydf1,1,tapply,gl3,3,中值,na.rm=真
> 1 2 3
>A 456325084616498
>B 63763 37970 24485
>C 60360 63896 18114
>D 36685 67705 57872
>E 75262 81216 28193
>F 66601 62308 27985
>A_Mo1 323952 62613 72238
>B_Mo1 344944 38701 78418
>C_Mo1 69601 77816 11953
>杜莫15126873611 33347
>E_Mo1 95607 97586 26466
>法乌莫1 81739 68345 25860
可以使用“应用族”函数在基础中执行此操作
tapplydf1,1,tapply,gl3,3,中值,na.rm=真
> 1 2 3
>A 456325084616498
>B 63763 37970 24485
>C 60360 63896 18114
>D 36685 67705 57872
>E 75262 81216 28193
>F 66601 62308 27985
>A_Mo1 323952 62613 72238
>B_Mo1 344944 38701 78418
>C_Mo1 69601 77816 11953
>杜莫15126873611 33347
>E_Mo1 95607 97586 26466
>法乌莫1 81739 68345 25860
我希望行名称也在那里,但您要删除什么them@Learner如果您查看我的基本R解决方案,它不会删除它们。是否也可以为每个解决方案添加SD?@Learner使用相同的代码,您可以将rowMedians更改为rowSds或从第二个案例df[paste0uniquenm1,_SD]我怎样才能一次完成所有操作,这样以后就不需要合并它们了?此外,中位数或sd不会在列中打印它。我希望行名称也在列中,但要删除什么them@Learner如果您查看我的基本R解决方案,它不会删除它们。是否也可以为每个解决方案添加SD?@Learner使用相同的代码,您可以将rowMedians更改为rowSds或从第二个案例df[paste0uniquenm1,_SD]我怎样才能一次完成所有操作,这样以后就不需要合并它们了?此外_median或_sd不在列中打印它,或tapplydf1,1,tapply,gl3,3,sd,na.rm=TRUE以获得sd。然后可以使用cbind将它们粘贴在一起。或者使用tapplydf1、1、tapply、gl3、3、sd、na.rm=TRUE获得sd。然后可以使用cbind将它们粘贴在一起。
cols <- c("T", "T.1", "T.2")
newCols <- paste0("median_", paste0(cols, collapse = "_"))
df[[newCols]] <- apply(df[, cols], MARGIN=1, FUN=median)
> df
T T.1 T.2 BG BG.1 BG.2 TR TR.1 TR.2 median_T_T.1_T.2
A 36034 45632 59025 74767 50846 26688 16498 16272 20612 45632
B 63763 66505 52837 48210 37970 27830 26604 24485 713 63763
C 51432 60360 68571 70972 63896 17010 41201 14546 18114 60360
D 65100 36685 35788 67705 78296 54074 38417 74756 57872 36685
E 61444 107551 75262 85576 81216 26727 43709 28193 25684 75262
F 71012 53360 66601 89265 62308 31109 33217 770 27985 66601
A_Mo1 266610 323952 424683 393380 62613 24448 69943 72238 73618 323952
B_Mo1 389787 344944 340948 306633 21770 38701 80638 78418 1770 344944
C_Mo1 47659 69601 79487 77816 80955 17378 37444 9161 11953 69601
D_Mo1 63156 51268 42809 73611 88832 46327 31701 48618 33347 51268
E_Mo1 84593 130665 95607 106317 97586 25324 46781 26466 25824 95607
F_Mo1 84331 59704 81739 116890 68345 25325 31152 1078 25860 81739
cols <- c("T", "T.1", "T.2")
newCols <- paste0("median_", paste0(cols, collapse = "_"))
df[, (newCols) := apply(.SD, 1, median), .SDcols=cols]
df %>% rowwise() %>% mutate(T_median = median(T, T.1, T.2), BG_median = median(BG, BG.1,BG.2), TR_median = median(TR, TR.1, TR.2))
T T.1 T.2 BG BG.1 BG.2 TR TR.1 TR.2 T_median BG_median TR_median
<int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 36034 45632 59025 74767 50846 26688 16498 16272 20612 36034 74767 16498
2 63763 66505 52837 48210 37970 27830 26604 24485 713 63763 48210 26604
3 51432 60360 68571 70972 63896 17010 41201 14546 18114 51432 70972 41201
4 65100 36685 35788 67705 78296 54074 38417 74756 57872 65100 67705 38417
5 61444 107551 75262 85576 81216 26727 43709 28193 25684 61444 85576 43709
6 71012 53360 66601 89265 62308 31109 33217 770 27985 71012 89265 33217
7 266610 323952 424683 393380 62613 24448 69943 72238 73618 266610 393380 69943
8 389787 344944 340948 306633 21770 38701 80638 78418 1770 389787 306633 80638
9 47659 69601 79487 77816 80955 17378 37444 9161 11953 47659 77816 37444
10 63156 51268 42809 73611 88832 46327 31701 48618 33347 63156 73611 31701
11 84593 130665 95607 106317 97586 25324 46781 26466 25824 84593 106317 46781
12 84331 59704 81739 116890 68345 25325 31152 1078 25860 84331 116890 31152