gpt4 book ai didi

R:使用for循环将因子的水平部分匹配到字符串?

转载 作者:行者123 更新时间:2023-12-02 13:40:23 25 4
gpt4 key购买 nike

我有一个图和子图的数据集,在其中测量了树种的存在。我正在尝试遍历数据并确定每个图-子图组合中存在哪些物种。

我已经成功创建了一个数据框,用于识别每个绘图-子图组合中存在哪些物种,但现在我尝试为每个物种附加列,其中包含显示其存在的指示变量(值为 1)。

初始代码/data.frame如下所示:

f = aggregate(Species ~ Subplot + Plot, data = live.trees, 
FUN=function(x) paste(unique(x), collapse=', '))

a=rep(0, 35)
b=cbind(a,a,a,a,a,a,a,a,a,a,a,a)
colnames(b) = levels(live.trees$Species)
freq = as.data.frame(cbind(f, b))

Species = as.factor(live.trees$Species)

#Only showing 2 of 7 plots here...

freq[1:10,]
Subplot Plot Species AA AM AO BC BG BP EA RA RM SH XG XM
1 1 1 RA 0 0 0 0 0 0 0 0 0 0 0 0
2 2 1 EA, BP, XM, BC, AA, XG, RA 0 0 0 0 0 0 0 0 0 0 0 0
3 3 1 EA, XG, AA, AM, RA 0 0 0 0 0 0 0 0 0 0 0 0
4 4 1 AA, XM, RA, EA 0 0 0 0 0 0 0 0 0 0 0 0
5 5 1 EA, BC, RA, AA 0 0 0 0 0 0 0 0 0 0 0 0
6 1 2 XM, BC, RA, AM 0 0 0 0 0 0 0 0 0 0 0 0
7 2 2 RM, RA 0 0 0 0 0 0 0 0 0 0 0 0
8 3 2 XM, BC, RA 0 0 0 0 0 0 0 0 0 0 0 0
9 4 2 RA, XM 0 0 0 0 0 0 0 0 0 0 0 0
10 5 2 XM, XG, AA, BC, BG, RA 0 0 0 0 0 0 0 0 0 0 0 0

我现在正在尝试编写一个 for 循环,该循环遍历表格,如果物种的两个字符串在每个物种列(AA、AM、AO 等)中匹配,则在每个物种列中粘贴“1” freq$Species 列。到目前为止我编写的 for 循环代码是:

#Manually going through and assigning a 1 value for each species 
#using a partial string match with grepl()

for(k in 1:nrow(freq))
if(grepl("AA", freq$Species[[k]]) == "TRUE")
(freq$AA[k] = 1) else
if(grepl("AM", freq$Species[[k]]) == "TRUE")
(freq$AM[k] = 1) else
if(grepl("AO", freq$Species[[k]]) == "TRUE")
(freq$AO[k] = 1) else
if(grepl("BC", freq$Species[[k]]) == "TRUE")
(freq$BC[k] = 1)
#.... etc. (cutting off here to save space)

该代码在一定程度上有效,但会覆盖之前的每个物种列,而且也相当笨重。

Subplot Plot                    Species AA AM AO BC BG BP EA RA RM SH XG XM
1 1 1 RA 0 0 0 0 0 0 0 0 0 0 0 0
2 2 1 EA, BP, XM, BC, AA, XG, RA 1 0 0 0 0 0 0 0 0 0 0 0
3 3 1 EA, XG, AA, AM, RA 1 0 0 0 0 0 0 0 0 0 0 0
4 4 1 AA, XM, RA, EA 1 0 0 0 0 0 0 0 0 0 0 0
5 5 1 EA, BC, RA, AA 1 0 0 0 0 0 0 0 0 0 0 0
6 1 2 XM, BC, RA, AM 0 1 0 0 0 0 0 0 0 0 0 0
7 2 2 RM, RA 0 0 0 0 0 0 0 0 0 0 0 0
8 3 2 XM, BC, RA 0 0 0 1 0 0 0 0 0 0 0 0
9 4 2 RA, XM 0 0 0 0 0 0 0 0 0 0 0 0
10 5 2 XM, XG, AA, BC, BG, RA 1 0 0 0 0 0 0 0 0 0 0 0

我该怎么办:

1) 获取 for 循环以停止覆盖前面列中的物种存在指示器?

2)用更优雅的方式编写for循环?我以为我可以创建一个名为“物种”的因子变量,并循环遍历其中的元素(在第一个 for 循环内)...但是我的新手体验开始显现。

任何帮助或建议将不胜感激!

我知道这不是一个可重现的示例,但我正在寻找可能有助于为我指明正确方向的一般建议或提示。我将尝试在 R 中找到一个默认数据集,我可以强制同时复制我的麻烦。

提前谢谢您!

注意:“物种”列是作为字符串创建的,因此具有类字符。

最佳答案

尝试

library(qdapTools)
res <- cbind(freq[1:3], mtabulate(strsplit(freq$Species, ', ')))
rowsum(res[,4:ncol(res)], group= res$Plot)
# AA AM BC BG BP EA RA RM XG XM
#1 4 1 2 0 1 4 5 0 2 2
#2 1 1 3 1 0 0 5 1 1 4

或者

aggregate(.~Plot, res[c(2,4:ncol(res))], FUN=sum)
# Plot AA AM BC BG BP EA RA RM XG XM
#1 1 4 1 2 0 1 4 5 0 2 2
#2 2 1 1 3 1 0 0 5 1 1 4

或者

library(dplyr)
res %>%
group_by(Plot) %>%
summarise_each(funs(sum), 4:ncol(res))

或者

library(data.table)
setDT(res)[, lapply(.SD, sum), by =Plot, .SDcols=4:ncol(res)]

数据

freq <- structure(list(Subplot = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 
5L), Plot = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), Species = c("RA",
"EA, BP, XM, BC, AA, XG, RA", "EA, XG, AA, AM, RA", "AA, XM, RA, EA",
"EA, BC, RA, AA", "XM, BC, RA, AM", "RM, RA", "XM, BC, RA", "RA, XM",
"XM, XG, AA, BC, BG, RA"), AA = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L), AM = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
AO = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), BC = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), BG = c(0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L), BP = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L), EA = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
), RA = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), RM = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), SH = c(0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L), XG = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L), XM = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
)), .Names = c("Subplot", "Plot", "Species", "AA", "AM",
"AO", "BC", "BG", "BP", "EA", "RA", "RM", "SH", "XG", "XM"),
class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

关于R:使用for循环将因子的水平部分匹配到字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31604392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com