繁体   English   中英

向量元素之间的R差异,分为列

[英]R difference between vector elements, split into columns

我有一个值向量:

data <- c(3L, 4L, 6L, 9L, 11L, 14L, 22L, 33L, 34L, 35L, 38L, 46L, 48L, 
49L, 55L, 56L, 64L, 69L, 70L, 71L, 81L, 85L, 87L, 90L, 94L, 97L, 
99L, 100L, 102L, 112L, 115L, 118L, 123L, 125L, 131L, 139L, 144L, 
145L, 156L, 159L, 160L, 161L, 162L, 163L, 165L, 167L, 168L, 170L, 
175L, 177L, 190L, 191L, 194L, 199L, 203L, 206L, 210L, 211L, 216L, 
220L, 221L, 223L, 225L, 227L, 230L, 233L, 246L, 249L, 253L, 255L, 
257L, 268L, 270L, 273L, 277L, 278L, 283L, 288L, 289L, 290L, 291L, 
294L, 296L, 302L, 305L, 309L, 314L, 318L, 319L, 335L, 344L, 345L, 
350L, 352L, 357L, 367L, 371L, 375L, 381L, 383L, 399L, 401L, 402L, 
408L, 409L, 417L, 420L, 422L, 423L, 427L, 430L, 434L, 438L, 441L, 
443L, 447L, 458L, 461L, 472L, 475L, 479L, 489L, 495L, 497L, 500L, 
501L, 509L, 514L, 523L, 525L, 530L, 531L, 537L, 540L, 541L, 542L, 
545L, 546L, 549L, 552L, 553L, 554L, 563L, 566L, 567L, 575L, 583L, 
596L, 598L, 599L, 603L, 606L, 608L, 616L, 618L, 623L, 627L, 636L, 
644L, 667L, 668L, 675L, 677L, 685L, 686L, 689L, 694L, 696L, 701L, 
706L, 713L, 714L, 726L, 740L, 743L, 750L, 755L, 756L, 760L, 778L, 
779L, 784L, 786L, 790L, 792L, 799L, 800L, 810L, 811L, 814L, 817L, 
826L, 836L, 853L, 856L, 861L, 864L, 866L, 867L, 878L, 884L, 885L, 
886L, 890L, 894L, 898L, 899L, 902L, 905L, 914L, 919L, 921L, 922L, 
930L, 938L, 939L, 943L, 948L, 949L, 950L, 952L, 953L, 955L, 956L, 
958L, 962L, 971L, 974L, 975L, 984L, 992L, 997L, 999L, 1005L, 
1012L, 1015L, 1016L, 1030L, 1034L, 1046L, 1047L, 1048L, 1049L, 
1053L, 1054L, 1059L, 1061L, 1063L, 1068L, 1083L, 1084L, 1086L, 
1087L, 1102L, 1104L, 1105L, 1109L, 1114L, 1118L, 1121L, 1122L, 
1125L, 1135L, 1136L, 1142L, 1145L, 1149L, 1150L, 1153L, 1154L, 
1161L, 1165L, 1168L, 1171L, 1175L, 1193L, 1203L, 1204L, 1214L, 
1215L, 1217L, 1221L, 1230L, 1231L, 1235L, 1237L, 1238L, 1240L, 
1241L, 1264L, 1267L, 1271L, 1272L, 1275L, 1279L, 1281L, 1283L, 
1284L, 1288L, 1290L, 1292L, 1296L, 1298L, 1304L, 1306L, 1307L, 
1309L, 1310L, 1312L, 1317L, 1325L, 1331L, 1346L, 1347L, 1350L, 
1351L, 1354L, 1355L, 1356L, 1363L, 1365L, 1375L, 1378L, 1379L, 
1380L, 1381L, 1383L, 1385L, 1388L, 1392L, 1393L, 1394L, 1395L, 
1396L, 1397L, 1404L, 1411L, 1423L, 1425L, 1436L, 1439L, 1440L, 
1441L, 1442L, 1449L, 1473L, 1478L, 1481L, 1482L, 1486L, 1495L, 
1497L, 1500L, 1502L, 1503L, 1506L, 1519L, 1520L, 1525L, 1528L, 
1529L, 1557L, 1563L, 1565L, 1566L, 1567L, 1569L, 1571L, 1573L, 
1576L, 1579L, 1582L, 1593L, 1594L, 1596L, 1597L, 1604L, 1610L, 
1611L, 1615L, 1622L, 1624L, 1628L, 1629L, 1630L, 1632L, 1635L, 
1653L, 1654L, 1660L, 1661L, 1662L, 1667L, 1671L, 1673L, 1678L, 
1690L, 1692L, 1693L, 1697L, 1700L, 1701L, 1705L, 1712L, 1724L, 
1728L, 1744L, 1746L, 1748L, 1749L, 1752L, 1756L, 1763L, 1769L, 
1779L, 1785L, 1798L, 1799L, 1812L, 1813L, 1819L, 1821L, 1823L, 
1827L, 1829L, 1830L, 1831L, 1836L, 1837L, 1839L, 1842L, 1851L, 
1855L, 1856L, 1857L, 1858L, 1862L, 1872L, 1879L, 1880L, 1882L, 
1883L, 1887L, 1889L, 1891L, 1892L, 1894L, 1903L, 1904L, 1905L, 
1922L, 1923L, 1926L, 1927L, 1931L, 1932L, 1936L, 1937L, 1938L, 
1939L, 1941L, 1942L, 1943L, 1944L, 1946L, 1948L, 1952L, 1959L, 
1960L, 1963L, 1965L, 1968L, 1972L, 1973L, 1977L, 1985L, 1989L, 
1994L, 1995L, 1996L, 1997L, 2000L, 2001L, 2015L, 2025L, 2026L, 
2048L, 2049L, 2050L, 2051L, 2054L, 2058L, 2060L, 2061L, 2062L, 
2063L, 2065L, 2066L, 2068L, 2069L, 2071L, 2073L, 2074L, 2079L, 
2080L, 2081L, 2085L, 2087L, 2088L, 2089L, 2091L, 2094L, 2095L, 
2099L, 2100L, 2101L, 2102L, 2105L, 2107L, 2108L, 2109L, 2111L, 
2113L, 2115L, 2117L, 2122L, 2125L, 2126L, 2127L, 2131L, 2135L, 
2138L, 2140L, 2145L, 2146L, 2151L, 2152L, 2155L, 2157L, 2162L, 
2165L, 2169L, 2174L, 2177L, 2179L, 2180L, 2181L, 2183L, 2186L, 
2189L, 2190L, 2193L, 2195L, 2198L, 2200L, 2201L, 2203L, 2211L, 
2214L, 2218L, 2221L, 2222L, 2223L, 2225L, 2228L, 2231L, 2236L, 
2241L, 2245L, 2250L, 2253L, 2259L, 2261L, 2265L, 2266L, 2267L, 
2269L, 2270L, 2271L, 2272L, 2273L, 2274L, 2280L, 2281L, 2283L, 
2284L, 2291L, 2292L, 2293L, 2297L, 2298L, 2300L, 2303L, 2305L, 
2307L, 2308L, 2309L, 2310L, 2312L, 2317L, 2321L, 2324L, 2327L, 
2328L, 2332L, 2333L, 2336L, 2339L, 2342L, 2356L, 2359L, 2363L, 
2364L, 2366L, 2367L, 2369L, 2370L, 2372L, 2373L, 2381L, 2382L, 
2383L, 2384L, 2385L, 2388L, 2392L, 2402L, 2403L, 2406L, 2407L, 
2409L, 2413L, 2414L, 2418L, 2420L, 2428L, 2434L, 2436L, 2437L, 
2444L, 2447L, 2450L, 2462L, 2463L, 2469L, 2472L, 2473L, 2475L, 
2476L, 2478L, 2483L, 2491L, 2496L, 2504L, 2508L, 2511L, 2514L, 
2516L, 2523L, 2527L, 2529L, 2530L, 2536L, 2538L, 2541L, 2543L, 
2544L, 2547L, 2551L, 2553L, 2556L, 2559L, 2561L, 2563L, 2564L, 
2569L, 2576L, 2580L, 2584L, 2585L, 2590L, 2600L, 2610L, 2617L, 
2625L, 2629L, 2635L, 2640L, 2643L, 2644L, 2649L, 2653L, 2654L, 
2661L, 2662L, 2667L, 2668L, 2669L, 2670L, 2678L, 2682L, 2683L, 
2685L, 2687L, 2695L, 2706L, 2707L, 2712L, 2714L, 2715L, 2716L, 
2717L, 2721L, 2726L, 2733L, 2736L, 2740L, 2742L, 2745L, 2748L, 
2751L, 2764L, 2772L, 2774L, 2783L, 2790L, 2791L, 2795L, 2802L, 
2803L, 2804L, 2807L, 2815L, 2820L, 2825L, 2826L, 2841L, 2847L, 
2850L, 2855L, 2856L, 2862L, 2868L, 2869L, 2872L, 2874L, 2875L, 
2876L, 2885L, 2886L, 2889L, 2896L, 2901L, 2905L, 2908L, 2909L, 
2911L, 2912L, 2916L, 2917L, 2922L, 2928L, 2935L, 2939L, 2940L, 
2947L, 2949L, 2952L, 2954L, 2959L, 2961L, 2962L, 2964L, 2970L, 
2972L, 2979L, 2981L, 2987L, 2988L, 2989L, 2993L, 3001L, 3003L, 
3008L, 3015L, 3022L, 3026L, 3028L, 3031L, 3032L, 3035L, 3037L, 
3038L, 3041L, 3045L, 3055L, 3062L, 3068L, 3069L, 3070L, 3075L, 
3076L, 3080L, 3081L, 3089L, 3091L, 3094L, 3102L, 3104L, 3106L, 
3113L, 3115L, 3116L, 3121L, 3122L, 3124L, 3125L, 3132L, 3133L, 
3135L, 3137L, 3141L, 3146L, 3149L, 3150L, 3153L, 3154L, 3155L, 
3161L, 3162L, 3163L, 3164L, 3165L, 3168L, 3169L, 3173L, 3174L, 
3175L, 3187L, 3190L, 3194L, 3196L, 3201L, 3202L, 3206L, 3207L, 
3213L, 3218L, 3219L, 3220L, 3227L, 3228L, 3231L, 3236L, 3248L, 
3251L, 3252L, 3259L, 3263L, 3264L, 3265L, 3266L, 3267L, 3268L, 
3269L, 3278L, 3281L, 3283L, 3286L, 3288L, 3289L, 3294L, 3295L, 
3300L, 3301L, 3306L, 3314L, 3316L, 3318L, 3319L, 3321L, 3322L, 
3323L, 3328L, 3331L, 3339L, 3342L, 3345L, 3349L, 3355L, 3357L, 
3365L, 3367L, 3368L, 3369L, 3371L, 3376L, 3380L, 3383L, 3391L, 
3393L, 3403L, 3411L, 3412L, 3414L, 3415L, 3420L, 3421L, 3422L, 
3423L, 3424L, 3429L, 3430L, 3433L, 3434L, 3438L, 3439L, 3440L, 
3441L, 3442L, 3446L, 3449L, 3455L, 3464L, 3476L, 3477L, 3478L, 
3480L, 3482L, 3490L, 3494L, 3495L, 3499L, 3505L, 3509L, 3510L, 
3511L, 3517L, 3518L, 3521L, 3522L, 3523L, 3529L, 3530L, 3532L, 
3537L, 3539L, 3540L, 3542L, 3546L, 3547L, 3549L, 3551L, 3554L, 
3556L, 3557L, 3567L, 3574L, 3575L, 3580L, 3581L, 3585L, 3586L, 
3594L, 3598L, 3601L, 3604L, 3613L, 3615L, 3619L, 3621L, 3628L, 
3631L, 3632L, 3633L, 3634L, 3637L, 3639L, 3640L, 3642L, 3652L, 
3657L, 3663L, 3664L, 3665L, 3672L, 3673L, 3675L, 3677L, 3690L, 
3692L, 3697L, 3700L, 3704L, 3711L, 3714L, 3719L, 3723L, 3727L, 
3729L, 3730L, 3731L, 3737L, 3739L, 3742L, 3744L, 3745L, 3750L, 
3752L, 3753L, 3759L, 3766L, 3774L, 3775L, 3777L, 3778L, 3781L, 
3783L, 3785L, 3788L, 3790L, 3794L, 3802L, 3808L, 3809L, 3819L, 
3820L, 3827L, 3830L, 3832L, 3836L, 3837L, 3843L, 3849L, 3852L, 
3853L, 3854L, 3857L, 3858L, 3859L, 3868L, 3872L, 3889L, 3890L, 
3892L, 3894L, 3901L, 3902L, 3908L, 3918L, 3920L, 3921L, 3929L, 
3934L, 3936L, 3939L, 3942L, 3952L, 3954L, 3955L, 3956L, 3958L, 
3960L, 3965L, 3968L, 3969L, 3971L, 3974L, 3988L, 3990L, 3999L, 
4002L, 4003L, 4008L, 4009L, 4010L, 4011L, 4018L, 4019L, 4021L, 
4025L, 4031L, 4035L, 4037L, 4051L, 4054L, 4060L, 4061L, 4064L, 
4069L, 4072L, 4073L, 4077L, 4078L, 4081L, 4087L, 4095L, 4098L, 
4100L, 4101L, 4103L, 4108L, 4111L, 4115L, 4125L, 4126L, 4130L, 
4138L, 4140L, 4153L, 4159L, 4160L, 4162L, 4163L, 4165L, 4166L, 
4171L, 4173L, 4176L, 4180L, 4183L, 4184L, 4191L, 4194L, 4197L, 
4199L, 4200L, 4207L, 4208L, 4213L, 4214L, 4215L, 4231L, 4237L, 
4239L, 4241L, 4243L, 4246L, 4249L, 4258L, 4259L, 4263L, 4267L, 
4268L, 4273L, 4274L, 4275L, 4281L, 4286L, 4294L, 4299L, 4301L, 
4305L, 4306L, 4307L, 4311L, 4315L, 4320L, 4333L, 4337L, 4338L, 
4340L, 4342L, 4350L, 4354L, 4355L, 4357L, 4363L, 4370L, 4374L, 
4379L, 4384L, 4389L, 4393L, 4394L, 4398L, 4410L, 4414L, 4419L, 
4423L, 4428L, 4440L, 4448L, 4450L, 4451L, 4452L, 4453L, 4456L, 
4464L, 4473L, 4474L, 4476L, 4482L, 4483L, 4485L, 4486L, 4487L, 
4488L, 4495L, 4503L, 4507L, 4508L, 4509L, 4511L, 4513L, 4515L, 
4516L, 4523L, 4529L, 4530L, 4531L, 4533L, 4540L, 4543L, 4544L, 
4546L, 4549L, 4556L, 4560L, 4563L, 4565L, 4573L, 4574L, 4578L, 
4579L, 4586L, 4587L, 4593L, 4596L, 4599L, 4602L, 4607L, 4610L, 
4614L, 4616L, 4617L, 4620L, 4626L, 4627L, 4633L, 4641L, 4649L, 
4650L, 4653L, 4656L, 4670L, 4676L, 4677L, 4679L, 4683L, 4684L, 
4686L, 4687L, 4692L, 4705L, 4709L, 4712L, 4719L, 4722L, 4723L, 
4724L, 4729L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L)

我想根据元素之间的差值将此向量划分为新向量,这样:从元素1(向量中的3)开始,我想计算该元素与下一个元素的差(绝对值)。 如果差异等于或小于3,则附加一个新向量。 如果差异大于3,则创建新矢量并计算该值与下一个值之间的差异。 再次等于或小于3追加到此向量。

我有一个类似的代码:

D2 <- split(data, data %/% 3)

max_length <- max(vapply(D2, length, numeric(1)))
D2 <- lapply(D2, function(d, m) c(d, rep(0, m - length(d))), max_length) 
(D2 <- as.data.frame(D2))

但是它并没有存储我想要的值(仅当差异> 3时才创建新列

预期产量:

3 9 14 22 33
4 11      34
6         35

准确地说,输出计算如下:

我们计算:3-3 = 0、4-3 = 1、6-3 =3。9-3= 6(大于3,因此我们从9开始新列)。 并计算9-11 = 3,9-14 = 5(大于3,因此我们打开下一列并以14开头),依此类推

splits <- integer(length(data))

j <- 1
for (i in seq_along(data)) {
  if (data[i] - data[j] > 3L) {
    splits[i] <- 1L
    j <- i
  }
}

splits <- cumsum(splits)
res <- split(data, splits)
res[1:5]

#$`0`
#[1] 3 4 6
#
#$`1`
#[1]  9 11
#
#$`2`
#[1] 14
#
#$`3`
#[1] 22
#
#$`4`
#[1] 33 34 35

如有必要,可以轻松地将for循环转换为Rcpp,以提高效率。

这是我得到的:

y<-c(3, 4, 6, 9, 11, 14, 22, 33, 34, 35, 38, 46, 48, 49, 55, 56, 
 64, 69, 70, 71, 81, 85, 87, 90, 94, 97, 99, 100, 102, 112, 115, 
 118, 123, 125, 131, 139, 144, 145, 156, 159, 160, 161, 162, 163, 
 165, 167, 168, 170, 175, 177, 190, 191, 194)
diff.y<-diff(y)
m<-matrix(NA,ncol=length(y),nrow=length(y))
compteur.col<-1
compteur.row<-1
max.row<-1
m[1,1]<-y[1]
for (i in 1:length(diff.y)){
    if(diff.y[i]>3 | y[i+1]-m[1,compteur.col]>3){
        compteur.col<-compteur.col+1
        compteur.row<-1
        m[1,compteur.col]<-y[i+1]
    } else {
        compteur.row<-compteur.row+1
        max.row<-max(max.row,compteur.row)
        m[compteur.row,compteur.col]<-y[i+1]
    }
}
m<-m[1:max.row,1:compteur.col]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM