【问题标题】:how to create categories conditionally using other variables values and sequence如何使用其他变量值和序列有条件地创建类别
【发布时间】:2019-06-26 13:51:29
【问题描述】:

如果能帮助我创建一个函数,该函数允许我使用一组其他变量值的顺序来创建一个变量的类别,我将不胜感激。

具体来说,我想要一个函数:

  1. 创建变量variable的类别E1first时间变量ABID的值的每个组合 出现在数据集中。
  2. 创建变量variable 的类别E2 second 时间变量ABID 的值的每个组合 出现在数据集中。
  3. 创建变量variable的类别E3third时间变量ABID的值的每个组合 出现在数据集中。
  4. 创建变量variable的类别Ennth时间变量ABID的值的每个组合 出现在数据集中。

#样本数据:

rowdT<-structure(list(A = c("a1", "a2", "a1", "a1", "a2", "a1", "a1", 
            "a2", "a1"), B = c("b2", "b2", "b2", "b1", "b2", "b2", "b1", 
            "b2", "b1"), ID = c("3", "4", "3", "1", "4", "3", "1", "4", "1"
            ), E = c(0.621142094943352, 0.742109450696123, 0.39439152996948, 
            0.40694392882818, 0.779607277916503, 0.550579323666347, 0.352622183880119, 
            0.690660491345867, 0.23378944873769)), class = c("data.table", 
            "data.frame"), row.names = c(NA, -9L))     
sampleDT <- melt(rowdT, id.vars = c("A", "B", "ID"))

#输入数据:

    A  B  ID variable    value
1: a1 b2  3        E 0.6211421
2: a2 b2  4        E 0.7421095
3: a1 b2  3        E 0.3943915
4: a1 b1  1        E 0.4069439
5: a2 b2  4        E 0.7796073
6: a1 b2  3        E 0.5505793
7: a1 b1  1        E 0.3526222
8: a2 b2  4        E 0.6906605
9: a1 b1  1        E 0.2337894

#预期输出:

    A  B  ID variable    value
4: a1 b1  1        E1 0.4069439
1: a1 b2  3        E1 0.6211421
2: a2 b2  4        E1 0.7421095
7: a1 b1  1        E2 0.3526222
3: a1 b2  3        E2 0.3943915
5: a2 b2  4        E2 0.7796073
9: a1 b1  1        E3 0.2337894
6: a1 b2  3        E3 0.5505793
8: a2 b2  4        E3 0.6906605

提前感谢您的帮助。

【问题讨论】:

  • sampleDT%&gt;%group_by(A,B,ID)%&gt;%mutate(variable=paste0('E',1:n())
  • 当我添加 ) 时,它给出了错误:Error: This function should not be called directly
  • 它对我有用。 library(dplyr);library(data.table);sampleDT%&gt;%group_by(A,B,ID)%&gt;%mutate(variable=paste0('E',1:n()))
  • 在我做detach("package:plyr", unload = TRUE) 之后它工作。谢谢,@A.Suliman。

标签: r function data.table reshape tidyr


【解决方案1】:

首先将您的变量转换为字符向量以进行适当的强制转换,然后使用data.table

sampleDT$variable = as.character(sampleDT$variable)

sampleDT[, variable := paste(variable,1:.N,sep = ""), by = c("A", "B", "ID")]

这会根据观察到的ABID 的组合创建独特的计数。

这会得到以下输出:

    A  B ID variable     value
1: a1 b2  3       E1 0.6211421
2: a2 b2  4       E1 0.7421095
3: a1 b2  3       E2 0.3943915
4: a1 b1  1       E1 0.4069439
5: a2 b2  4       E2 0.7796073
6: a1 b2  3       E3 0.5505793
7: a1 b1  1       E2 0.3526222
8: a2 b2  4       E3 0.6906605
9: a1 b1  1       E3 0.2337894

如有必要,您可以重新订购。

【讨论】:

  • 仍在使用大型数据集测试解决方案。我会让你知道它是否有效。谢谢你。
  • 这个答案的另一个变体:sampleDT[, v := paste0(variable, rowid(A, B, ID))]
  • 感谢@sumshyftw 的帮助。您的解决方案也适用于我的较大数据。刚刚完成测试。
  • 感谢@Frank 的帮助。您的解决方案也适用于我的较大数据。刚刚完成测试。
猜你喜欢
  • 1970-01-01
  • 2021-01-04
  • 2020-05-30
  • 2020-09-17
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多