我想基于变量(df$pet
)的值创建三个新的数据帧,以便最终得到dfdogCorrect,dfcatCorrect和dfratCorrect。
我当前代码的问题是我无法使新数据帧的名称正常工作。我使用的是unique(df$pet)
,它接受pet中的第一个唯一元素并将其分配给第一个新数据帧,而不管新数据帧的内容如何。
任何帮助您将不胜感激。
初始点:
df <- data.frame(pet=c("dog","dog","dog","cat","cat","rat","rat","rat","rat"),relstatus=c(1,2,1,2,2,2,2,1,2),age=c(34,54,56,32,45,64,65,32,45), stringsAsFactors = FALSE)
期望的结果:
dfdogCorrect <- data.frame(pet=c("dog","dog","dog"),relstatus=c(1,2,1),age=c(34,54,56), stringsAsFactors = FALSE)
dfcatCorrect <- data.frame(pet=c("cat","cat"),relstatus=c(2,2),age=c(32,45), stringsAsFactors = FALSE)
dfratCorrect <- data.frame(pet=c("rat","rat","rat","rat"),relstatus=c(2,2,1,2),age=c(64,65,32,45), stringsAsFactors = FALSE)
当前代码:
s <- setNames(split(df, df$pet), paste0("df", unique(df$pet)))
list2env(s, globalenv())
最佳答案
您可以通过在f
的split()
参数中创建列表名称来自动设置列表名称。我不会添加list2env()
行,因为我认为最好将类似的数据保留在列表中,而不是将它们分散到全局环境中。
split(df, paste0("df", df$pet, "Correct"))
# $dfcatCorrect
# pet relstatus age
# 4 cat 2 32
# 5 cat 2 45
#
# $dfdogCorrect
# pet relstatus age
# 1 dog 1 34
# 2 dog 2 54
# 3 dog 1 56
#
# $dfratCorrect
# pet relstatus age
# 6 rat 2 64
# 7 rat 2 65
# 8 rat 1 32
# 9 rat 2 45