R数据框中的条件语句
Conditional statement in R dataframe
我有如下数据帧 df。
dput(df)
structure(list(X = c(1, 2, 5, 7, 8), Y = c(3, 5, 8, 7, 2), Z = c(2,
8, 7, 4, 3), R = c(6, 6, 6, 6, 66)), .Names = c("X", "Y", "Z",
"R"), row.names = c(NA, -5L), class = "data.frame")
df
class(df)
我必须在两种情况下修改 df。
第一的:
修改 df 以便它检查每行的 X、Y、Z 之间的最小值,取最小值替换为相应的 R 值。
第二种情况:
这是每行中 X、Y、Z、R 之间的最小值,它被替换为 X、Y、Z 和 R 之间的最大值并创建一个新的 df。
我应该怎么得到它?
我尝试了 ifelse 和 if 以及 else 但无法得到我想要的..
任何帮助将不胜感激。
您可以使用 "df" 的前三个列创建新数据集 "df1"。将 "df1" 与“-1”相乘,使最大值变为 "min"(假设没有负值)。在此示例中,每行的值都是唯一的。因此,您可以使用函数 max.col
并指定 ties.method='first'
。它将为您提供每行最大值(此处为最小值)的索引,cbind
它将 1:nrow(df)
创建 "row/column" 索引并提取 [=28= 的元素] 基于该索引 (df1[cbind..]
) 并将这些值更改为 "R" 列值 (<- df$R
)。然后您可以将原始 "df" 列 ("df[1:3]") 更改为新值。如果每行有多个 "minimum" 值,您可以使用针对第二种情况描述的 "loop" 方法。
df1 <- df[1:3]
df1[cbind(1:nrow(df),max.col(-1*df1, 'first'))] <- df$R
df[1:3] <- df1
df
# X Y Z R
#1 6 3 2 6
#2 6 5 8 6
#3 6 8 7 6
#4 7 7 6 6
#5 8 66 3 66
创建 "df" (df2
) 的副本,使用 pmax
获取每行的 max
值,遍历 "df2" 的行( sapply(seq_len...)
) 并将每行中的 "minimum" 值更改为相应的 "max" 值 ("MaxV"),转置 (t
) 并将其分配回 "df2" (df2[]
)
df2 <- df
#only use this if there is only a single "minimum" value per row
# and no negative values in the data
#df2[cbind(1:nrow(df), max.col(-1*df2, 'first'))] <-
# do.call(pmax, df2)
MaxV <- do.call(pmax, df2)
df2 [] <- t(sapply(seq_len(nrow(df2)), function(i) {
x <- unlist(df2[i,])
ifelse(x==min(x), MaxV[i], x)}))
df2
# X Y Z R
#1 6 3 6 6
#2 6 8 8 6
#3 8 8 7 8
#4 7 7 7 7
#5 8 66 66 66
我有如下数据帧 df。
dput(df)
structure(list(X = c(1, 2, 5, 7, 8), Y = c(3, 5, 8, 7, 2), Z = c(2,
8, 7, 4, 3), R = c(6, 6, 6, 6, 66)), .Names = c("X", "Y", "Z",
"R"), row.names = c(NA, -5L), class = "data.frame")
df
class(df)
我必须在两种情况下修改 df。 第一的: 修改 df 以便它检查每行的 X、Y、Z 之间的最小值,取最小值替换为相应的 R 值。 第二种情况: 这是每行中 X、Y、Z、R 之间的最小值,它被替换为 X、Y、Z 和 R 之间的最大值并创建一个新的 df。 我应该怎么得到它? 我尝试了 ifelse 和 if 以及 else 但无法得到我想要的.. 任何帮助将不胜感激。
您可以使用 "df" 的前三个列创建新数据集 "df1"。将 "df1" 与“-1”相乘,使最大值变为 "min"(假设没有负值)。在此示例中,每行的值都是唯一的。因此,您可以使用函数 max.col
并指定 ties.method='first'
。它将为您提供每行最大值(此处为最小值)的索引,cbind
它将 1:nrow(df)
创建 "row/column" 索引并提取 [=28= 的元素] 基于该索引 (df1[cbind..]
) 并将这些值更改为 "R" 列值 (<- df$R
)。然后您可以将原始 "df" 列 ("df[1:3]") 更改为新值。如果每行有多个 "minimum" 值,您可以使用针对第二种情况描述的 "loop" 方法。
df1 <- df[1:3]
df1[cbind(1:nrow(df),max.col(-1*df1, 'first'))] <- df$R
df[1:3] <- df1
df
# X Y Z R
#1 6 3 2 6
#2 6 5 8 6
#3 6 8 7 6
#4 7 7 6 6
#5 8 66 3 66
创建 "df" (df2
) 的副本,使用 pmax
获取每行的 max
值,遍历 "df2" 的行( sapply(seq_len...)
) 并将每行中的 "minimum" 值更改为相应的 "max" 值 ("MaxV"),转置 (t
) 并将其分配回 "df2" (df2[]
)
df2 <- df
#only use this if there is only a single "minimum" value per row
# and no negative values in the data
#df2[cbind(1:nrow(df), max.col(-1*df2, 'first'))] <-
# do.call(pmax, df2)
MaxV <- do.call(pmax, df2)
df2 [] <- t(sapply(seq_len(nrow(df2)), function(i) {
x <- unlist(df2[i,])
ifelse(x==min(x), MaxV[i], x)}))
df2
# X Y Z R
#1 6 3 6 6
#2 6 8 8 6
#3 8 8 7 8
#4 7 7 7 7
#5 8 66 66 66