【发布时间】:2018-02-22 16:46:55
【问题描述】:
我正在尝试使用嵌套在 for 循环中的 if-else 循环来遍历数据帧并根据第一个 df 的条件输出一个新的数据帧。
在这个数据框中,我想将每一行 N 与 N+1 行进行比较,
如果第 1 列和第 2 列中的列元素匹配
并且第N行和第N+1行的第3列和第4列的列值之差小于或等于1
那我想在N+1行点写一个新行
第 1 列和第 2 列的元素与第 N+1 行中的元素相同
比较第 3 列的 N 和 N+1 时第 3 列的最小值
以及第 4 列的最大值,用于比较第 4 列的 N 和 N+1
例子:
aaa <- c(rep("cat",4), "dog", "dog")
bbb <- c("fit", rep("fat",2), rep("fat", 3))
ccc <- c(6,5,6,9,9,9)
ddd <- c(11,10,10,22,23,24)
df <- data.frame(aaa,bbb,ccc,ddd)
从这里开始:
aaa bbb ccc ddd
cat fit 6 11
cat fat 5 10
cat fat 6 10
cat fat 9 22
dog fat 9 23
dog fat 9 24
到想要的输出:
aaa bbb ccc ddd
cat fit 6 11
cat fat 5 10
cat fat 9 22
dog fat 9 24
我的尝试是这样的:
result <- data.frame()
for (i in c(1:as.numeric(nrow(df))-1)){
if(df[i,1] == df[i+1,1]
&
df[i,2] == df[i+1,2]
&
abs(df[i,3]-df[i+1,3]) <=1
&
abs(df[i,4]-df[i+1,4]) <=1)
{
result[i+1,] <- c(df[i,1],df[i,2],min(df[i,3],df[i+1,3]),max(df[i,4],df[i+1,4]))
result[i,] <- c(NA,NA,NA,NA)
} else {
result[i,] <- df[i,]
}
}
result
【问题讨论】:
-
在您的示例输出中,在
ccc列中,cat fat同时具有min和max。对吗? -
是的,当第 N 行和第 N+1 行中的第 1 列和第 2 列相等时,取第 3 列的最小值和第 N 和 N+1 行之间的第 4 列的最大值。抱歉,如果不清楚
-
抱歉,目前还不清楚。
ccc列是第 3 列,您同时拥有min和max。如果您现在再次说您只想要min和第4 列的最大值ddd,那么您发布的示例输出是错误的? -
所有条件都必须为真才能在行之间进行比较,即对于 i=1, col[1,1]==col[2,1], col[1,2] != col[2,2],因此写一行与第1行相同。我不是要取整行的最小值,而是满足所有条件时两行之间的最小值。跨度>
-
第 3 列会这样吗?
tapply(df$ccc, paste(df$aaa, df$bbb), FUN = min).
标签: r if-statement dataframe