我有一个值向量:
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))
但它不会存储我想要的值(创建新列,仅当差异&gt; 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开始)依此类推
答案 0 :(得分:3)
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,以提高效率。
答案 1 :(得分:1)
这是我得到的:
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]