【问题标题】:for the length of each row in column Y duplicate row in column X对于 Y 列中每一行的长度 X 列中的重复行
【发布时间】:2014-04-22 11:19:26
【问题描述】:

(请随意将标题调整为更合适的内容)

我有一个 data.frame 有两列,XYlist 如下

X <- list("A","B","C","D")
Y <- list("a",c("a", "b"),"c",c("a", "c", "d"))

df <- as.data.frame(cbind(X,Y))

Y 列有两个或多个条目或作为此处的字符时,我希望Y(字符数)中每一行的长度对应于X 列中相同行的数量。更简单地说,对于Y 中的每个字符,它们必须是X 中的单独一行。

# desired output

X Y
A a
B a
B b
C c
D a
D c
D d

我不知道该怎么做,所以任何指针将不胜感激,谢谢!

【问题讨论】:

  • X 中的元素是否曾经有多个项目?您实际处理了多少列?

标签: r dataframe


【解决方案1】:

试试

do.call(rbind, Map(expand.grid, X, Y))
##   Var1 Var2
## 1    A    a
## 2    B    a
## 3    B    b
## 4    C    c
## 5    D    a
## 6    D    c
## 7    D    d

【讨论】:

  • 干杯!正是我需要的!
【解决方案2】:

这里有一个替代方案:

library(data.table)
DT <- as.data.table(df)
DT[, list(Y = unlist(Y)), by = unlist(X)]
#    unlist Y
# 1:      A a
# 2:      B a
# 3:      B b
# 4:      C c
# 5:      D a
# 6:      D c
# 7:      D d

这将比 Map + expand.grid 方法快得多,即使您只处理 1000 行;但是,只有在“X”的每一“行”只有一个元素时,这才会以其当前形式起作用。


这是一个函数,它应该能够处理多列中包含多个元素的列表,并且应该很容易处理多于两列。

egFun <- function(indf) {
  DT <- data.table(indf, keep.rownames=TRUE, key = "rn")
  out <- Reduce(function(x, y) x[y, allow.cartesian = TRUE], 
         lapply(setdiff(names(DT), "rn"), function(x) 
           DT[, list(unlist(get(x))), by = rn]))
  setnames(out, names(DT))
  out
}

用法如下:

egFun(df)

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多